Java 会话超时处理-(在会话自动过期时更新相应的用户行)
我开发了一个web应用程序。我想在其中添加注销功能。为此,我使用了HttpSessionListener,但并没有按照我想要的那样工作Java 会话超时处理-(在会话自动过期时更新相应的用户行),java,database,session,logout,session-timeout,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 ac
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用户关闭浏览器窗口
请给出您有价值的想法。解决您的问题的方法是,每当值解除绑定并更新数据库时,使用HttpSessionBindingListener 当用户关闭浏览器时,将触发onunload事件,您可以调用相应的servlet从logoutUser()javascript函数注销用户(更新数据库)
< script>
function logoutUser()
{
// Call logout servlet
}
< / script >
< / head >
< body onunload="logoutUser()" >
.....
.....
onunload的一个问题是,即使在刷新页面时,它也会被触发。即使是基于javascript的,当然也不推荐使用。您对上述所有情况的通用解决方案有何想法?请帮助解决此问题。通常,对于安全性高的应用程序,当用户关闭浏览器时,他们不会注销用户。实际注销仅在会话超时后发生。与netbanking类似:当用户在未单击注销按钮的情况下关闭任何netbanking浏览器时,在会话超时之前,系统将不允许用户再次登录。你可以尝试同样的方法。