Session 记录Tomcat过期会话的策略
我的web应用程序将用户登录和注销记录在数据库表中,以便跟踪用户活动 当用户显式登录或注销时,这种方法很有效,因为底层身份验证代码负责这些日志事件 但是,当用户让计算机闲置30分钟时,web会话将过期,我们将有一个登录事件,而没有相应的注销事件 我认为解决这个问题的唯一策略是在web.xml中定义的30分钟之前触发javascript事件,并在会话到期之前将用户踢出。然而,这有需要javascript的限制,当有人使用多个选项卡时,可能会产生一些意外的结果(即,用户正在使用tab2,而会话在tab1中过期)Session 记录Tomcat过期会话的策略,session,tomcat,Session,Tomcat,我的web应用程序将用户登录和注销记录在数据库表中,以便跟踪用户活动 当用户显式登录或注销时,这种方法很有效,因为底层身份验证代码负责这些日志事件 但是,当用户让计算机闲置30分钟时,web会话将过期,我们将有一个登录事件,而没有相应的注销事件 我认为解决这个问题的唯一策略是在web.xml中定义的30分钟之前触发javascript事件,并在会话到期之前将用户踢出。然而,这有需要javascript的限制,当有人使用多个选项卡时,可能会产生一些意外的结果(即,用户正在使用tab2,而会话在ta
对于这种情况,您有什么建议?使用会话侦听器在会话过期时更新数据库 这是一个如何实现会话的简单示例
您想使用
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
}
}
如果您使用上面的代码,您会发现没有显式注销的用户将获得一条注销记录,而显式注销的用户将获得两条。为什么?因为您可能会使用“注销”操作来写入“注销”记录,然后会话侦听器会立即运行,并生成第二个审核条目
这个问题有两个明显的解决方案:
请将源代码的相关部分从您的链接添加到您的答案,以提高其价值。