倒计时定时器,用于激活控制器方法

时间:2010-07-21 05:54:06

标签: javascript ruby-on-rails timer countdown

我正在建立一个调查页面,用户只有有限的时间回答他们的所有问题。给定的时间作为@ test.time_allowed存储在模型中,这是一个表示秒的整数。

我需要一种简单且非用户可篡改的方式来获取计时器在视图上显示并在结束时执行控制器操作。如何实现此目的?

我是一个相对初学者,所以任何具体的答案都会非常有用。谢谢。

--- --- UPDATE

@Bryan:
如果服务器端完成计时,我假设有一种防篡改方式?例如,如您所建议的那样,客户端可能有一个javascript计时器,但在提交时无法根据窗口初始加载的时间检查提交时间?

3 个答案:

答案 0 :(得分:2)

由于从客户端返回的数据永远不会完全受信任,因此服务器必须知道最初生成的表单的时间戳是什么。这可以通过在会话或数据库中保存变量来完成,但这是有问题的。相反,服务器可以在表单中放置加密或签名的时间戳,以确保客户端没有更改它。然后,服务器可以根据需要拒绝提交。在客户端上,单独的逻辑可以处理UI部分,为用户提供有关时间限制的反馈,但最终只能松散地耦合到服务器处理。

详细说明:

服务器应该生成两个表单字段:一个具有系统时间戳time = Time.now.to_i以跟踪生成表单的时间,另一个具有签名Digest::MD5.hexdigest(time.to_s.concat('Some-secret-string-1234'))(注意此处使用相同的时间值表示时间戳)表格字段和签名表单字段)。这验证表单是使用服务器生成的时间戳提交的,该时间戳未被客户端更改。

您可能还会发送另一个带有时间限制的表单字段。

在客户端上,读取时间戳,使用setTimeout和时间限制生成倒计时或前端要执行的任何操作。

提交表单时,通过使用与以前相同的方法重新生成MD5签名来验证随表单提交的时间戳。确保它与表单提交的签名相匹配。然后,将时间戳添加到超时,并确保它晚于当前服务器时间。如果是这样,您的时间限制内有效提交。

您可能需要为服务器上的超时提供比在客户端上更多的余地,可能需要几秒钟,以解决网络延迟,否则用户可能会看到剩余一秒,单击提交,然后按收到服务器请求的时间,似乎计时器已过期。

请务必添加require 'digest/md5'以访问MD5。

使用这样的MD5签名是验证客户端是否以无状态方式更改表单中的关键参数的好方法,无论您希望它们是什么。你的伎俩是一个很好的补充。

祝你好运!

答案 1 :(得分:0)

没有100%的防篡改方法可以实现这一点,因为您需要使用可以被足够恶意的用户关闭或操纵的JavaScript来执行此操作。

但是,如果您不关心这些问题,您可以在页面上设置超时,以便在经过秒数后提交表单。要做到这一点,你需要类似于以下的东西。显然,需要从服务器端的模板生成timeInMilliseconds页面。

window.setTimeout(function() {
                     document.forms['survey_form'].submit();
                  },
                  timeInMilliseconds);

答案 2 :(得分:0)

为正在进行的调查创建模型,并添加after_create过滤器,将截止日期设置为Time.now + survey_duration。保留逻辑,拒绝在模型中延迟发送答案。