我有一个HttpSessionListener
的实现,其中应用程序中的'锁定'资源是使用sessionDestroyed
方法发布的。
'lock'信息在数据库中维护,并且在大多数情况下锁的发布工作正常。但在某些情况下,我仍然看到资源被锁定 - 即使没有会话活动!
所以,我怀疑是否有可能sessionDestroyed
没有被调用?假设会话超时 - 将调用sessionDestroyed
方法吗?
假设用户关闭浏览器选项卡而不注销(销毁会话) - 那么是否会调用侦听器?
提前致谢!
答案 0 :(得分:2)
servlet引擎将处理会话超时。
它将在会话不再有效时自行确定,并将调用sessionDestroyed
。 (这可能在用户关闭浏览器后的某个时间发生。)
其他一些观点:
<强>登录强>
也许您可以向sessionCreated和sessionDestroyed方法添加一些日志记录。对于每个sessionCreated,你应该有一个sessionDestroyed。
例外处理
也许事情仍然是锁定的东西不是由于会话没有被破坏,而是由于你的sessionDestroyed逻辑中的错误。你有足够的异常处理/记录吗?
<强>时序强>
您是否等了足够长时间检查锁定的资源? (关闭所有客户端,并考虑应用程序/服务器上配置的会话超时值)。如前所述,服务器无法检测到用户关闭浏览器,但它确实维护了其http会话列表,并且会在超时后销毁它们。
答案 1 :(得分:1)
所以,我怀疑是否有可能没有调用sessionDestroyed?假设会话超时 - 会调用sessionDestroyed方法吗?
是。会话在超时或某人以编程方式过期时被销毁(通过HttpSession.invalidate()
)。
假设用户关闭浏览器选项卡而不注销(销毁会话) - 那么是否会调用侦听器?
不,因为会话仍然有效。如果所述用户再次打开该网站,他/她的会话仍然有效。
来自HttpSession
javadoc:
绑定方法完成后发送通知。对于无效或过期的会话,会话失效或过期后会发送通知。