重启后Spring没有将tomcat持久会话恢复到会话注册表?

Posted

技术标签:

【中文标题】重启后Spring没有将tomcat持久会话恢复到会话注册表?【英文标题】:Spring not restoring tomcat persistent sessions to session registry after restart? 【发布时间】:2010-12-07 22:17:45 【问题描述】:

我正在使用 Tomcat 6.2 和 Spring MVC 2.5。我注意到,当用户登录时,我可以重新启动 Tomcat,并且用户无需重新验证即可继续浏览。这似乎来自于 Tomcat 在重新启动时保持会话的能力。

然而,这些持久化的会话似乎并没有回到 Spring 会话注册表中。在重新启动之前从会话注册表中检索用户的会话信息时,我会返回信息。尽管会话注册表没有关于用户的信息,但发布重新启动。

我是否错过了一些配置,让 Spring 在重新启动后恢复这些持久的 Tomcat 会话?如果做不到这一点,有没有办法在不调用 sessionInformation.expireNow() 的情况下将用户踢出 Web 应用程序?

【问题讨论】:

您指的是什么“会话注册表”? Spring使用tomcat的会话内存,它没有自己的。 我所指的会话注册表是内部 Spring Security 类 (SessionRegistryImpl),它在用户登录时使用用户的会话信息填充。在 tomcat 重新启动时,似乎 tomcat 能够持久化并恢复用户的会话,并且 Spring 以某种方式接受它作为有效会话,但 Spring 的会话注册表中没有关于该会话的数据。 啊,你说的是Spring Security?这与 Spring MVC 完全不同。 【参考方案1】:

您想要持久化然后从会话中恢复的对象是否可序列化?

【讨论】:

我最初确实得到了序列化异常并已修复它们。修复它们似乎并没有解决这个问题。【参考方案2】:

试试这个配置:

<bean id="filterInvocationInterceptor" class="org.acegisecurity.intercept.web.FilterSecurityInterceptor">
    ...
    <property name="alwaysReauthenticate" value="true"/>
</bean>

【讨论】:

谢谢,这听起来很有希望。如果您的身份验证存储是数据库,是否会对性能产生影响? @rodrigoap 你能详细说明一下配置代表什么吗?谢谢

以上是关于重启后Spring没有将tomcat持久会话恢复到会话注册表?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过管理器路径名在 Spring Boot 中禁用 Tomcat 会话持久性?

tomcat重启后session没有清除的解决办法

Spring-security:即使在 JVM 重启后也能保持活动会话

如何持久化在 docker 内的 tomcat 上运行的 Spring Boot 应用程序的会话

重启后 Spring Security 仍然经过身份验证(但没有会话)

Redis持久化