This question already has answers here:
How to call sessionDestroyed when a session times out

(4个答案)


3年前关闭。




我有一个HttpSessionListener的实现,其中应用程序中的“锁定”资源是使用sessionDestroyed方法释放的。

“锁”信息在数据库中维护,并且在大多数情况下,锁的释放都可以正常工作。但是在某些情况下,我仍然看到资源被锁定-即使没有 session 处于 Activity 状态!

因此,我怀疑是否有可能无法调用sessionDestroyed?假设 session 超时-将调用sessionDestroyed方法吗?

假设用户关闭浏览器选项卡而不注销(销毁 session ),那么将调用侦听器吗?

提前致谢!

最佳答案

Servlet引擎将处理 session 超时。
当 session 不再有效时,它将自行确定,并将调用sessionDestroyed。 (这可能在用户关闭浏览器后的一段时间内发生)。

其他一些要点:

正在记录

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

异常(exception)处理

东西仍然被锁定的事实可能不是由于 session 没有被销毁,而是由于sessionDestroyed逻辑中的错误。您在那里是否有足够的异常处理/日志记录?

时间

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

07-26 06:00