Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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
Session 记录Tomcat过期会话的策略_Session_Tomcat - Fatal编程技术网

Session 记录Tomcat过期会话的策略

Session 记录Tomcat过期会话的策略,session,tomcat,Session,Tomcat,我的web应用程序将用户登录和注销记录在数据库表中,以便跟踪用户活动 当用户显式登录或注销时,这种方法很有效,因为底层身份验证代码负责这些日志事件 但是,当用户让计算机闲置30分钟时,web会话将过期,我们将有一个登录事件,而没有相应的注销事件 我认为解决这个问题的唯一策略是在web.xml中定义的30分钟之前触发javascript事件,并在会话到期之前将用户踢出。然而,这有需要javascript的限制,当有人使用多个选项卡时,可能会产生一些意外的结果(即,用户正在使用tab2,而会话在ta

我的web应用程序将用户登录和注销记录在数据库表中,以便跟踪用户活动

当用户显式登录或注销时,这种方法很有效,因为底层身份验证代码负责这些日志事件

但是,当用户让计算机闲置30分钟时,web会话将过期,我们将有一个登录事件,而没有相应的注销事件

我认为解决这个问题的唯一策略是在web.xml中定义的30分钟之前触发javascript事件,并在会话到期之前将用户踢出。然而,这有需要javascript的限制,当有人使用多个选项卡时,可能会产生一些意外的结果(即,用户正在使用tab2,而会话在tab1中过期)


对于这种情况,您有什么建议?

使用会话侦听器在会话过期时更新数据库

这是一个如何实现会话的简单示例


您想使用
HttpSessionListener
。它是Servlet规范为这种情况定义的标准接口

请参见下面的警告

import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

public class LogoutListener implements HttpSessionListener {
  @Override
  public void sessionDestroyed(HttpSessionEvent event) {
    HttpSession session = event.getSession();
    // NOTE: You need to store some kind of user identification
    //       in the session. My example just has a "username"
    //       in here.
    String username = session.getAttribute("username");

    // If the username is null, there was no logged-in user
    // to log-out (e.g. non-authenticated user).
    if(null != username) {
      // NOTE: Obviously, this needs to call your existing
      //       "logout"-recording code. Just an example.
      MyDBUtilities.registerLogout(username, System.currentTimeMillis());
    }
  }

  @Override
  public void sessionCreated(HttpSessionEvent event) {
    // Ignore
  }
}
如果您使用上面的代码,您会发现没有显式注销的用户将获得一条注销记录,而显式注销的用户将获得两条。为什么?因为您可能会使用“注销”操作来写入“注销”记录,然后会话侦听器会立即运行,并生成第二个审核条目

这个问题有两个明显的解决方案:

  • 停止在“注销”操作中记录注销事件,并让事件处理程序记录所有注销
  • 注销用户时删除用户的“username”会话属性,事件处理程序将忽略该事件

  • 请将源代码的相关部分从您的链接添加到您的答案,以提高其价值。