【发布时间】:2011-01-17 12:38:48
【问题描述】:
我有一个基于 jsp servlet 的应用程序,会话时间超过 30 分钟,我想在有人故意或意外关闭浏览器窗口时立即使会话无效(操作系统关闭/从 tast manager 关闭/关机)
我可以对此进行检查并使会话无效吗?
【问题讨论】:
标签: java session-timeout
我有一个基于 jsp servlet 的应用程序,会话时间超过 30 分钟,我想在有人故意或意外关闭浏览器窗口时立即使会话无效(操作系统关闭/从 tast manager 关闭/关机)
我可以对此进行检查并使会话无效吗?
【问题讨论】:
标签: java session-timeout
无法处理这种情况。
有些浏览器会提供此设置作为他们的偏好,但您无法以编程方式处理此设置。
最大:
连接关闭后,您可以从页面(可能是标题)进行投票,与 gmail 中的 gtalk 相同。
你为什么要这样做,你已经在服务器中配置了,会话应该保持空闲 30 分钟,之后它将在服务器中过期。
如果您想这样做,请使用以下 javascript 或 jquery(更适合跨浏览器),当浏览关闭事件发生时,通过在 jsp 中运行以下代码发送 ajax 请求以使会话无效
(request.getSession(false).setMaxInactiveInteral(0);)
来自 javascript
<body onbeforeunload="doAjaxCall();">
(or)
jQuery(window).bind("beforeunload", function(){
// Do ajax request and dont wait for the response.
});
if ( (getcurrentTime() - session.getCreationTime()) > 2000 ) { }
【讨论】:
beforeunload 或unload 事件中发送ajax 请求,因此您当然不应该依赖它。只需让会话过期或缩短其生命周期并使用轮询使其保持活动状态。
不,我不相信你能做到这一点,因为浏览器中没有可用的钩子来让它在关闭时发送断开连接通知(某种),我认为没有服务器端询问最近会话以测试其连接状态的机制。
【讨论】:
如果您使用的是 tomcat 5.0/5.5/6.0 容器,则 tomcat 会话管理器生成的用于跟踪会话的 cookie (JSESSIONID) 是 per-session cookie(仅浏览器内存 cookie)而不是持久性 cookie(写入磁盘)。这是因为会话管理器执行(硬编码)setMaxAge(-1),因此生成的 HTTP 响应包含:
Set-Cookie: JSESSIONID=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; Path=/,没有Expire=<i>date</i>。
因此,当浏览器关闭时(所有浏览器窗口,或仅包含 cookie 的窗口,取决于各种浏览器实现),cookie - 和会话 - 都会丢失。 [*]
这与<session-timeout> 无关,这是一个告诉tomcat 服务器端 会话管理器在空闲 超过指定时间时使会话过期的设置.
[*] 它们仍将保留在服务器端的磁盘上,直到会话超时到期,但不会有带有 cookie 的请求激活它们。
【讨论】: