gpt4 book ai didi

java - 为什么 SessionDestroyedEvent 会触发两次?

转载 作者:太空宇宙 更新时间:2023-11-04 12:54:37 24 4
gpt4 key购买 nike

我有以下 session 销毁监听器:

public class SessionStateListener implements ApplicationListener {
private static final Logger LOGGER = LoggerFactory.getLogger(SessionStateListener.class);

@Override
public void onApplicationEvent(ApplicationEvent event) {
if (event instanceof SessionDestroyedEvent) {
System.out.println("log out");
}
}
}

我以 user1 身份登录,然后我再次打开另一个浏览器以 user1 身份登录。

之后我看到“log out”输出两次。
对我来说预期结果 - 1。

你能解释一下这种行为吗?

附注

Spring 安全配置:

<bean id="concurrentSessionControlAuthenticationStrategy" class="com.MyConcurrentSessionControlAuthenticationStrategy">
<constructor-arg name="sessionRegistry" ref="mySessionRegistry" />
<property name="maximumSessions" value="1" />
</bean>

P.P.S

即使我第一次由第一个用户登录,此事件也会触发

最佳答案

事实上 Spring 是基于 servlet 工作的。 Servlet 容器(例如 Tomcat)默认创建 session 实例 ( StandardSession )。此 session 实例与 Spring 安全性无关。

在首次登录期间,Spring 安全性会销毁此默认 session ,并创建它自己的 session 实例,与特定用户关联。

但是对于 HttpSessionEventPublisher(实际上通知 ApplicationListener)来说,这个 session 实例是否与 Spring 安全相关并不重要。它只是监听 session 中发生的事件,并通知其他人。

这就是该事件触发两次的原因。当您第一次登录时,Spring 会销毁默认容器的 session 。当您第二次登录时,您的 session 策略类会破坏用户之前的 session 。

关于java - 为什么 SessionDestroyedEvent 会触发两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35523394/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com