【问题标题】:Session time out handling - (to update perticular user row when session expires automatically)会话超时处理 - (在会话自动到期时更新特定用户行)
【发布时间】:2012-10-15 06:02:07
【问题描述】:

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

请提出您的宝贵意见。

【问题讨论】:

    标签: java database session logout session-timeout


    【解决方案1】:

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

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

    < script>
    
    function logoutUser()
    
    {
    
     // Call logout servlet 
    
    
    }
    
    < / script >
    < / head >
    
    < body onunload="logoutUser()" >
    
    .....
    

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

    【讨论】:

    • 甚至那是基于 javascript...当然不推荐。您对上述所有案例的通用解决方案有任何想法吗?请帮忙
    • 通常用于安全密集型应用程序,当用户关闭浏览器时,他们不会注销用户。实际注销仅在会话超时后发生。像网银一样:当用户关闭任何网银浏览器而没有点击注销按钮时,系统将不允许用户再次登录,直到会话超时发生。您可以尝试相同的方法。
    猜你喜欢
    • 2012-04-17
    • 2012-10-25
    • 1970-01-01
    • 2012-11-10
    • 2015-10-10
    • 1970-01-01
    • 2017-10-06
    • 2012-08-16
    • 1970-01-01
    相关资源
    最近更新 更多