我有一个 HttpSessionListener
的实现,其中应用程序中的“锁定”资源使用 sessionDestroyed
方法释放。
“锁定”信息保存在数据库中,在大多数情况下,锁定的释放工作正常。但在某些情况下,我仍然看到资源被锁定 - 即使没有 Activity session !
所以,我怀疑是否有可能 sessionDestroyed
没有被调用?假设 session 超时 - sessionDestroyed
方法会被调用吗?
假设用户在没有注销的情况下关闭浏览器选项卡(破坏 session )-那么是否会调用监听器?
提前致谢!
servlet 引擎将处理 session 超时。
它将自行确定 session 何时不再有效,并将调用 sessionDestroyed
。 (这可能会在用户关闭浏览器一段时间后发生)。
其他几点:
记录
也许您可以向 sessionCreated 和 sessionDestroyed 方法添加一些日志记录。对于每个 sessionCreated 你应该有一个 sessionDestroyed。
异常处理
也许东西保持锁定的事实不是由于 session 没有被销毁,而是由于您的 sessionDestroyed 逻辑中的错误。您是否有足够的异常处理/日志记录?
时间
您是否等待了足够长的时间来检查您锁定的资源? (关闭所有客户端,并考虑应用程序/服务器上配置的 session 超时值)。如前所述,服务器无法检测到用户关闭浏览器,但它会维护其 http session 列表,并会在超时后销毁它们。