Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 会话超时处理-(在会话自动过期时更新相应的用户行)_Java_Database_Session_Logout_Session Timeout - Fatal编程技术网

Java 会话超时处理-(在会话自动过期时更新相应的用户行)

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

我开发了一个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用户关闭浏览器窗口


请给出您有价值的想法。

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

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

< script>

function logoutUser()

{

 // Call logout servlet 


}

< / script >
< / head >

< body onunload="logoutUser()" >

.....



.....

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

即使是基于javascript的,当然也不推荐使用。您对上述所有情况的通用解决方案有何想法?请帮助解决此问题。通常,对于安全性高的应用程序,当用户关闭浏览器时,他们不会注销用户。实际注销仅在会话超时后发生。与netbanking类似:当用户在未单击注销按钮的情况下关闭任何netbanking浏览器时,在会话超时之前,系统将不允许用户再次登录。你可以尝试同样的方法。