Session 如何在会话断开连接时进行清理

Session 如何在会话断开连接时进行清理,session,jsf,listener,destroy,Session,Jsf,Listener,Destroy,我有一个名为WorkSession的支持会话范围bean。当创建这个bean的实例时,我调用初始化函数(用@PostConstruct注释声明),它将数据库中的当前用户(我用JASS处理用户日志记录)状态更改为在线 我想在用户注销时做类似的事情(将用户状态更改为OFFLINE)。当用户按下网页上的“注销”按钮时,很容易做到这一点。问题是我不知道如何检测关闭的浏览器或浏览器中的选项卡 我看到带有注释@PreDestroy的方法不适用于此,因为它是由应用程序服务器垃圾收集器调用的,对吗 我使用Gla

我有一个名为
WorkSession
的支持会话范围bean。当创建这个bean的实例时,我调用初始化函数(用
@PostConstruct
注释声明),它将数据库中的当前用户(我用JASS处理用户日志记录)状态更改为
在线

我想在用户注销时做类似的事情(将用户状态更改为
OFFLINE
)。当用户按下网页上的“注销”按钮时,很容易做到这一点。问题是我不知道如何检测关闭的浏览器或浏览器中的选项卡

我看到带有注释
@PreDestroy
的方法不适用于此,因为它是由应用程序服务器垃圾收集器调用的,对吗

我使用GlassFish3.1.2、JPA2.0和JSF2.0

我看到带有注释
@PreDestroy
的方法不适用于此,因为它是由应用程序服务器垃圾收集器调用的,对吗

它应该很好用。GC绝对不会调用它。当会话被破坏时,容器将调用它。可能您的具体问题是,您希望当用户关闭整个浏览器时,会话立即被破坏。因此,情况并非如此。它只有在服务器端超时时才会被销毁。默认超时为30分钟。因此,如果您等待30分钟,那么会话将被销毁,并且将调用所有会话(和视图)范围的bean的
@PreDestroy

您可以通过
web.xml
中的
配置默认超时

另见:
  • -了解课程如何“在封面下”进行

顺便说一句,“会话断开连接”这一术语在web开发世界中毫无意义。

可能与