0

我开发了一个网络应用程序。我想在其中添加注销功能。为此,我使用了 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 用户关闭浏览器窗口。

请提出您的宝贵意见。

4

1 回答 1

1

每当值取消绑定更新数据库时,解决您的问题的方法是使用 HttpSessionBindingListener。

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

< script>

function logoutUser()

{

 // Call logout servlet 


}

< / script >
< / head >

< body onunload="logoutUser()" >

.....

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

于 2012-10-15T07:32:34.387 回答