【发布时间】:2016-09-01 23:48:03
【问题描述】:
我已经安装了gem 'auto-session-timeout' 来自动让用户退出非活动会话。我想在会话超时前给用户一个 2 分钟的警告
我在 application.html.erb 中添加了以下内容
<%= javascript_tag do %>
var d = new Date('<%= session[:auto_session_expires_at] %>');
setInterval(function(){
var d = new Date('<%= session[:auto_session_expires_at] %>');
var e = new Date();
var f = e.getTime();
var diff = d - f ;
alert(d + " | " + diff);
if (diff < 120000) {
// alert("Your session is about to timeout in less than 2 minutes " + diff);
}
}, 10000);
<% end %>
我的目标是使用 if (diff < 120000) 语句在注销 2 分钟后显示警报。
上面的代码通过自动会话超时获取会话变量,然后从当前日期(来自 js 的 getTime())中减去它并得出一个差异。
它几乎可以正常工作。如果与应用程序交互,计数器将被重置。但是,旧计数器似乎仍在运行。
换句话说,如果我查看未标记的警报语句的结果,我可以看到会话变量中的日期时间和计算出的差异。下面我只显示为简单起见显示的会议记录和会话。
25:22 168134 - 第一个警告框 - 显示会话变量的内容,还显示计算的差异或剩余毫秒数。
25:22 143249 -- 第二个警报框 -- 一切都如预期的那样。
25:22 120816 -- 因此,它使用会话变量中的正确信息正确倒计时
现在,如果我与应用交互,自动会话超时会重置会话变量 auto_session_expires_at。
26:13 158345 - 好的 - 正是我所期望的。 Javascript 正在获取新的会话变量并重新计算差异。
25:22 86327 -- 但现在我看到前一个会话变量并且差异计算器仍在运行
然后上面的循环将在“好”和“旧”会话变量和差异之间不断重复。我认为正在进行某种缓存,但我无法确定它。
这种行为对我来说是可重复的
================================================ ======== 我第一次打开应用程序时的 HTML
/<![CDATA[
var d = new Date('2016-05-06 15:58:19 -0400');
setInterval(function(){
var d = new Date('2016-05-06 15:58:19 -0400');
var e = new Date();
var f = e.getTime();
var diff = d - f ;
alert(d + " | " + diff);
if (diff < 120000) {
// alert("Your session is about to timeout in less than 2 minutes " + diff);
}
}, 10000);
//]]>
点击导航项后的 HTML。可以看到从会话变量中抓取的日期发生了变化
/<![CDATA[
var d = new Date('2016-05-06 15:58:48 -0400');
setInterval(function(){
var d = new Date('2016-05-06 15:58:48 -0400');
var e = new Date();
var f = e.getTime();
var diff = d - f ;
alert(d + " | " + diff);
if (diff < 120000) {
// alert("Your session is about to timeout in less than 2 minutes " + diff);
}
}, 10000);
//]]>
</script>
【问题讨论】:
-
当您说会话在您与站点交互后被重置时,您是否被重定向?我问这个是因为查看生成的 HTML 代码会很有用。
-
对不起,我可能有点模糊。我正在做的是从导航菜单中选择一些东西,因为它会加载一个新页面。
-
好的,可以把生成的HTML贴出来看看javascript函数吗?
-
另一个问题,您说:
this behavior is repeatable for me,您是否收到 2 个提醒,一个带有旧日期,另一个带有新日期? -
那么你应该保存原始
setTimeInterval的引用,然后调用clearInterval确保它在你与页面交互后不会继续运行。
标签: javascript ruby-on-rails session