使用 AJAX 自动刷新在 Web 应用程序上超时会话的方法

Posted

技术标签:

【中文标题】使用 AJAX 自动刷新在 Web 应用程序上超时会话的方法【英文标题】:Approaches to timing out sessions on a web app using AJAX autorefreshes 【发布时间】:2011-02-11 02:32:12 【问题描述】:

我正在编写一个 Web 应用程序,该应用程序以设定的时间间隔通过 AJAX 调用自动刷新数据。

因为它正在这样做,所以服务器端用户会话永远不会超时,因为每次 ajax 调用都会刷新最后一个活动。

我是否可以实施良好的客户端规则来使用户超时? IE。我应该在浏览器等中跟踪鼠标移动,还是应该将 AJAX 调用指向不刷新会话的 URL?

我喜欢我的 AJAX 调用访问启用会话的 URL,因为我还可以验证用户是否已登录等。

关于我是否应该打扰用户超时的任何想法?

【问题讨论】:

作为一般规则,您的问题应该超过 5 个字。 太棒了,我也在写一个! 抱歉,我按回车键,问题不小心贴出来了。 发生这种情况时一定会爱上它。 是的,花生画廊会在几秒钟内击中你。我觉得自己像个白痴,这就是我不小心按 Enter 的结果,以为它会让我输入一个新标签。 【参考方案1】:

我提示用户在一段时间不活动后通过 javascript 验证他们仍然处于活动状态。不活动被定义为“没有鼠标或键消息发送到窗口”。如果他们在一定时间后未能响应提示,我会重定向到退出页面。

我的基于 jQuery UI 的实现可以在 here 找到。

【讨论】:

我喜欢你的想法。正如已接受的答案中所述,我可能会将您的方法与 kevingessner 的方法相结合。 Ken,有没有办法仍然可以访问该代码?网址已损坏。【参考方案2】:

我通过在浏览器中维护“最后一次操作”时间戳并将其与心跳一起发送回服务器来完成此操作。然后,在服务器上,我根据此值与当前时间之间的差异检查超时,如果用户空闲时间过长,则调用注销例程。如果会话超时,则心跳结果将触发浏览器重新加载页面,由于会话现在已在服务器上注销,因此将清除所有用户特定信息。

我必须用这种方法解决的两个主要问题是服务器和客户端日期函数实现中时区的不同解释,以及如果用户在同一浏览器中打开多个选项卡发送不同的“最后”,则跟踪最近的操作操作”时间戳返回到服务器。

【讨论】:

【参考方案3】:

我使用过的一种技术:每次调用时增加 AJAX 调用之间的间隔。因此,您在 10 秒后进行第一次 AJAX 调用,然后等待 11 秒,然后等待 13 秒,然后等待 16、20、25 等等......(或一些类似的模式)。每次有页面活动(通过注册一些 JS 事件发现)时,您将间隔重置回您的起始值(例如 10 秒)。

当 AJAX 间隔变得比超时时间长时,此技术将导致一段时间未触摸浏览器的用户最终超时。作为额外的好处,您将减少服务器负载 - 如果用户长时间打开浏览器窗口,他们会在超时之前发出越来越少的请求。

【讨论】:

我喜欢这个策略。我想我将把它作为你的方法和肯布朗宁的方法的混合体来实现。我喜欢他弹出“嘿,whatchu doin'”类型的对话的想法。谢谢!

以上是关于使用 AJAX 自动刷新在 Web 应用程序上超时会话的方法的主要内容,如果未能解决你的问题,请参考以下文章

Tapestry 应用程序中的会话超时 AJAX 错误

通过 Web Socket 或 AJAX 刷新页面内容

Spring Web 应用程序中带有 Ajax 轮询的会话超时

Codeigniter:太多的 ajax 调用导致 Web 应用程序超时

Javascript ajax 仅在需要时刷新

登录页面刷新时会话超时