我开发了一个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用户关闭浏览器窗口。
请同样提出宝贵意见。
答案 0 :(得分:1)
当问题获取解除绑定更新数据库时,解决问题的方法是使用HttpSessionBindingListener。
当用户关闭浏览器时,会触发onunload事件,您可以调用相应的servlet从logoutUser()javascript函数中注销用户(更新数据库)。
< script>
function logoutUser()
{
// Call logout servlet
}
< / script >
< / head >
< body onunload="logoutUser()" >
.....
onunload的一个问题是即使刷新页面也会触发它。