Javascript 如何在rails中限制对页面的访问,除非用户通过从特定页面的链接到达?
我正在用Rails做一个基于计算机的在线测试。每个问题都有一个表单/questions/的页面URL。 每个问题页面上都有一个“下一步”按钮,指向下一个问题,如/questions/。我不希望用户能够手动键入任何问题的URL并转到该页面。Javascript 如何在rails中限制对页面的访问,除非用户通过从特定页面的链接到达?,javascript,ruby-on-rails,Javascript,Ruby On Rails,我正在用Rails做一个基于计算机的在线测试。每个问题都有一个表单/questions/的页面URL。 每个问题页面上都有一个“下一步”按钮,指向下一个问题,如/questions/。我不希望用户能够手动键入任何问题的URL并转到该页面。 有什么方法可以做到这一点,最好是服务器端解决方案。我有一个服务器端解决方案可以解决您的问题,如下所述 假设您有一个用户可以启动测试的固定链接 一旦用户开始测试,然后将问题id添加到会话中,如下所示 会话[:当前问题id]=参数[:问题id] 始终检查下一个问题
有什么方法可以做到这一点,最好是服务器端解决方案。我有一个服务器端解决方案可以解决您的问题,如下所述 假设您有一个用户可以启动测试的固定链接 一旦用户开始测试,然后将问题id添加到会话中,如下所示 会话[:当前问题id]=参数[:问题id] 始终检查下一个问题id,将其增加到session问题id,如果匹配,则显示问题或不执行任何操作重定向到back 如果你有像1,2,3…n这样的问题序列,那么这个解决方案会起作用。你可以使用:
,这将把您的ID转换为slug,这样最终用户就无法确定到底是什么传入了URL参数。有点像Bharat Soni: 您可以使用通过组合问题id和链接到用户会话的随机数而生成的id来构建url 您可以使用SHA1或您选择的算法组合这两个值。例如: 问题编号:123 秘密会话哈希:857c9e05-8ad0-4d6b-8112-5f442a731dc1 SecureRandom.uuid on sessionCreate 计算您的摘要: 摘要::SHA1.hexdigest{question_id}{secret_session_hash} =>e951774237433335a6c9c0928d5691ca0c2a31b5 构建您的url: 网站/question/123?key=e951774237433335a6c9c0928d5691ca0c2a31b5 您必须在控制器中确保在params[:key]中接收的摘要与您计算的摘要相同
通过这种方式,您可以合理地确保您的用户没有作弊,并且他不能将url提供给另一个人。作为一种简单但不是非常安全的解决方案,您是否可以让“下一步”按钮提交一个可能为空的表单,并且只允许/questions/id路径在POST中可用,而不允许获取?这样键入URL将不起作用,因为它将导致GET请求。