会话超时处理 - (在会话自动到期时更新特定用户行)

时间:2012-10-15 06:02:07

标签: java database session logout session-timeout

我开发了一个Web应用程序。我想在其中添加注销功能。为此,我使用了HttpSessionListener,但没有像我想的那样工作。

 import javax.servlet.http.HttpSessionListener;
 import javax.servlet.http.HttpSessionEvent;

 public class GetActiveSessions implements HttpSessionListener {

 private static int activeSessions = 0;

 public void sessionCreated(HttpSessionEvent se) {

 activeSessions++;
            System.out.println("+ 1 session");

 }


 public void sessionDestroyed(HttpSessionEvent se) {

 if(activeSessions > 0)

 activeSessions--;
            System.out.println("- 1 session");

 }


 public static int getActiveSessions() {
            System.out.println(activeSessions);

 return activeSessions;

 }

 }

我在sessionDestroyed()方法中标记了用户注销(通过更新数据库)。

如果会话超时则容器调用sessionDestroyed()方法并更新数据库但是当我显式调用session.invalidate()(当用户单击注销链接时)值是从会话对象取消绑定但容器不调用sessionDestroyed ()方法因此无法更新数据库。

并且还需要在用户关闭浏览器窗口时注销用户。

用户可以被标记为注销的机会有三种。 1.按容器的会话超时。 2.用户单击“注销”链接 3用户关闭浏览器窗口。

请同样提出宝贵意见。

1 个答案:

答案 0 :(得分:1)

当问题获取解除绑定更新数据库时,解决问题的方法是使用HttpSessionBindingListener。

当用户关闭浏览器时,会触发onunload事件,您可以调用相应的servlet从logoutUser()javascript函数中注销用户(更新数据库)。

< script>

function logoutUser()

{

 // Call logout servlet 


}

< / script >
< / head >

< body onunload="logoutUser()" >

.....

onunload的一个问题是即使刷新页面也会触发它。