如何在会话断开时进行一些清理

时间:2012-04-22 21:23:53

标签: session jsf listener destroy

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

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

我看到带注释@PreDestroy的方法对此不起作用,因为它是由应用服务器垃圾收集器调用的,对吗?

我使用Glassfish 3.1.2,JPA 2,0和JSF 2.0。

1 个答案:

答案 0 :(得分:1)

  

我看到带注释@PreDestroy的方法对此不起作用,因为它是由应用服务器垃圾收集器调用的,对吗?

它应该工作得很好。它绝对不是由GC调用的。会话被销毁时,容器会调用它。也许您的具体问题是,当用户关闭整个浏览器时,您希望会话立即销毁。因此不是这样。只有当它在服务器端超时时它才会被销毁。默认超时为30分钟。因此,如果等待30分钟,那么会话将被销毁,并且将调用所有会话(和视图)作用域的@PreDestroy

您可以在<session-config><session-timeout>中按web.xml配置默认超时。

另见:


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