【问题标题】:HttpSessionListener.sessionCreated() is getting called twice when Spring MVC application is startingHttpSessionListener.sessionCreated() 在 Spring MVC 应用程序启动时被调用两次
【发布时间】:2016-07-01 06:39:29
【问题描述】:

我在web.xml 中注册了HttpSessionListener 实现类,当应用程序启动时,sessionCreated() 方法被调用了两次。当我从应用程序注销时,sessionDestroyed() 正在调用,然后sessionCreated() 再次调用。为什么会这样?

public class SessionManager implements HttpSessionListener {

    @Override
    public void sessionCreated(HttpSessionEvent httpSessionEvent) {     
           System.out.println("Session Creation called!!..");     
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
           System.out.println("Session Destruction called!!..");   
    }
}

输出:

当应用程序启动时,它会打印两次“Session Creation called!!..”。当我注销时,它首先打印为“调用会话破坏!!..”,然后打印为“调用会话创建!!..”。

【问题讨论】:

  • 我认为sessionCreated() 方法会在生成新会话时被调用。所以当你注销时,session.invalidate() 会被调用,然后会为匿名用户创建一个新会话。
  • 不应该这样发生。你能帮我解决我哪里出错了吗?

标签: java spring spring-mvc spring-session


【解决方案1】:

当您成功登录到您的应用程序后,在创建新的经过身份验证的会话之前,旧的匿名会话将被销毁。注销时也会发生类似的事情,当首次销毁经过身份验证的会话时,会创建一个新的匿名会话。这和你描述的场景是一致的。

要验证正在创建和销毁的确切会话,请改进您的日志记录以包括会话 ID。例如:

public class SessionManager implements HttpSessionListener {

    public void sessionCreated(HttpSessionEvent httpSessionEvent) {
        System.out.println("session created: " + httpSessionEvent.getSession().getId());
    }

    public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
        System.out.println("session destroyed: " + httpSessionEvent.getSession().getId());
    }

}

【讨论】:

  • 我遇到了同样的问题,您指出要跟踪会话 ID,但是对于我试图计算在线用户数量的情况,我得到的值不准确,您能帮忙解决一下吗?
猜你喜欢
  • 2013-04-03
  • 2017-06-16
  • 1970-01-01
  • 1970-01-01
  • 2018-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多