0

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

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

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

4

2 回答 2

0

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

于 2012-05-07T20:14:04.133 回答
0

这是我现在的解决方案...

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

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

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

于 2012-05-07T22:29:34.540 回答