2012-10-15 25 views
0

我开发了一个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

解决您的问题的解决方法是,只要值取消绑定,就会使用HttpSessionBindingListener更新数据库。

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

< script> 

function logoutUser() 

{ 

// Call logout servlet 


} 

</script > 
</head > 

< body onunload="logoutUser()" > 

..... 

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

+0

甚至是基于javascript的...不是建议的课程。你有任何关于所有上述情况的常见解决方案的想法..请帮助解决 –

+1

通常,当用户关闭浏览器时,安全密集的应用程序,他们不会注销用户。 实际注销仅在会话超时后发生。 像netbanking:当用户关闭任何netbanking浏览器而不点击注销按钮时,系统将不允许用户再次登录,直到会话超时发生。 你可以尝试相同的方法。 – Munesh