HttpSessionListener - 会话超时时会调用sessionDestroyed方法吗?

时间:2011-06-23 10:43:17

标签: java session servlets java-ee session-timeout

我有一个HttpSessionListener的实现,其中应用程序中的'锁定'资源是使用sessionDestroyed方法发布的。

'lock'信息在数据库中维护,并且在大多数情况下锁的发布工作正常。但在某些情况下,我仍然看到资源被锁定 - 即使没有会话活动!

所以,我怀疑是否有可能sessionDestroyed没有被调用?假设会话超时 - 将调用sessionDestroyed方法吗?

假设用户关闭浏览器选项卡而不注销(销毁会话) - 那么是否会调用侦听器?

提前致谢!

2 个答案:

答案 0 :(得分:2)

servlet引擎将处理会话超时。 它将在会话不再有效时自行确定,并将调用sessionDestroyed。 (这可能在用户关闭浏览器后的某个时间发生。)

其他一些观点:

<强>登录

也许您可以向sessionCreated和sessionDestroyed方法添加一些日志记录。对于每个sessionCreated,你应该有一个sessionDestroyed。

例外处理

也许事情仍然是锁定的东西不是由于会话没有被破坏,而是由于你的sessionDestroyed逻辑中的错误。你有足够的异常处理/记录吗?

<强>时序

您是否等了足够长时间检查锁定的资源? (关闭所有客户端,并考虑应用程序/服务器上配置的会话超时值)。如前所述,服务器无法检测到用户关闭浏览器,但它确实维护了其http会话列表,并且会在超时后销毁它们。

答案 1 :(得分:1)

  

所以,我怀疑是否有可能没有调用sessionDestroyed?假设会话超时 - 会调用sessionDestroyed方法吗?

是。会话在超时或某人以编程方式过期时被销毁(通过HttpSession.invalidate())。

  

假设用户关闭浏览器选项卡而不注销(销毁会话) - 那么是否会调用侦听器?

不,因为会话仍然有效。如果所述用户再次打开该网站,他/她的会话仍然有效。

来自HttpSession javadoc

  

绑定方法完成后发送通知。对于无效或过期的会话,会话失效或过期后会发送通知。