拥有一个不会更新用户 java 会话的 servlet

Posted

技术标签:

【中文标题】拥有一个不会更新用户 java 会话的 servlet【英文标题】:Have one servlet that does not renew the user's java session 【发布时间】:2012-05-07 19:41:26 【问题描述】:

我有一个 servlet (GWT-RPC servlet),它仅用于检查用户会话是否已被清除(通过查看会话变量是否为空)。

问题在于,当它在用户浏览器中的计时器上运行时,每个检查会话是否已清除的请求都会将会话时间再更新 30 分钟。我可以尝试使计时器请求的频率低于会话超时。例如,如果会话每 30 分钟到期,而我每 35 分钟检查一次,则最多需要 70 分钟才能最终正确检测到会话已终止。

有人知道让 servlet 请求不更新会话的方法吗?

【问题讨论】:

禁用该特定 jsp 的会话创建会起作用吗? 【参考方案1】:

Servlet 规范要求访问会话的任何请求都会更新会话的上次访问时间,从而延长会话的生命周期。 “正确”的解决方案取决于您需要知道会话是否已过期的确切原因。我怀疑你真正想要的是javax.servlet.http.HttpSessionListener

【讨论】:

我需要能够在全 javascript 应用程序(通过 GWT)中设置一个客户端计时器,以检测您的会话已结束并显示一个弹出窗口以警告这一点或重定向到登录页面。 那么会话监听器不会帮助你。你的方法对我来说看起来不错。【参考方案2】:

这是我目前的解决方案...

创建一个 servlet 过滤器,用于更新名为“CUSTOM_LAST_SESSION_ACCESS”的会话变量。对 webapp 的任何请求都会将此变量更新为当前时间戳

如果该变量在过去 30 分钟内已更新,则通过 ajax 进行 Javascript 计时器检查,如果没有使会话无效。

这意味着如果您从不关闭浏览器,会话将通过 javascript 调用无效。如果您关闭浏览器,则会进行标准 Java 会话清理,因为 30 分钟内没有发生任何 HTTP 请求。

【讨论】:

以上是关于拥有一个不会更新用户 java 会话的 servlet的主要内容,如果未能解决你的问题,请参考以下文章

JavaWeb-Servle介绍

HTTP会话的使用与管理

Laravel 不会删除/更新会话

手把手实现Java权限-Shiro介绍

如果会话过期,如果没有活动并重定向登录页面,则烧瓶注销

如何在 laravel 中进行会话?