我是JSP的新手。我在一个实现HttpSessionListener
的类中使用了以下代码,以便在会话超时时获取SESSION OUT:
public void sessionCreated(HttpSessionEvent arg0) {
System.out.print("SESSION Created");
}
public void sessionDestroyed(HttpSessionEvent arg0) {
System.out.print("SESSION OUT");
}
我在web.xml
中设置了
<session-config>
<session-timeout>1</session-timeout>
</session-config>
servlet等待超过两分钟,然后调用sessionDestroyed
。
超时后是否有办法强制sessionDestroyed
?
提前致谢。
答案 0 :(得分:2)
当会话超时时,是什么让您认为sessionDestroyed
不被调用?或者换句话说,你对它被调用的事实的解释是什么?
servlet将以自己的方式处理会话的有效性,包括会话超时,当它确定会话不再有效时,它将调用您的方法。但是,我不认为任何servlet在这方面保证任何特定的及时性;我的理解是,它有点像垃圾收集,因为它确保在某些时候发生 ,但不一定是在会话符合销毁条件的最早可能实例上。
在任何情况下,似乎几乎可以肯定servlet正在做你想做的事情 - 看到会话超时并调用适当的方法 - 唯一的问题是你是否会在之后的60秒内看到这个最后一次请求或稍后。我建议你一般不应该依赖于调用这个方法的确切时间;用它来清理资源,当然,但不是为了程序的正确性(如果在无效的会话上调用方法,你将获得IllegalStateExceptions
)。如果你觉得你真的必须依赖这个,也许可以解释一下你正在做什么,以便其他人可以提出更合适的方法来实现这一点。
答案 1 :(得分:2)
servlet等待超过两分钟,然后调用sessionDestroyed。
是否有办法在超时时强制使用sessionDestroyed?
这是特定于实现的(取决于应用程序服务器)。有一个后台线程以定时间隔检查会话并收到所有过期的会话。这可能每分钟发生一次,但也可能每15分钟发生一次。如果您在关联的会话已经超时但尚未收到请求时触发请求,也会立即收回它们。
因此,如果您等待一分钟并发出新请求,则会立即收到该请求。真的没有必要担心这一点。你不需要强迫它立即收获它们,这本来是一项昂贵的任务。你知道,这只是关于编程,而不是关于某些魔法;)
答案 2 :(得分:1)
我认为J2EE规范不会保证何时调用侦听器上的方法。它只是说它们会在某个时候被调用。
我见过在一个容器(Tomcat)上运行但在另一个容器(OC4J)上不起作用的代码。开发人员对于何时调用sessionDestroyed方法做出了无效的假设。
<强>更新强>
请注意,此接口的行为在servlet规范的v2.4中已更改。有关详细信息,请参阅page 21。
答案 3 :(得分:1)
当您强制用户通过invalidate()方法注销时,HttpSessionListener sessionDestroyed()方法被调用两次,一次注销时,一次延迟一段时间后。如果在注销后将用户重定向回应用程序中的网页,则会发生这种情况。您实际上正在做的是启动另一个会话(如果您没有向所有网页添加安全/身份验证要求,这可能不会立即明显),并且sessionDestroyed()方法的延迟第二次调用是超时发生。注销时的简单解决方案将用户重定向到应用程序之外的网页。阅读本文session