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

Posted

技术标签:

【中文标题】如何通过管理器路径名在 Spring Boot 中禁用 Tomcat 会话持久性?【英文标题】:How to disable Tomcat session persistence in Spring Boot via Manager pathname? 【发布时间】:2015-01-23 15:50:09 【问题描述】:

在 Tomcat 中,conf/context.xml 中有一个众所周知的配置选项来禁用会话持久性:

<!-- Uncomment this to disable session persistence across Tomcat restarts -->
<Manager pathname="" />

当取消注释时,org.apache.catalina.Manager(例如org.apache.catalina.session.StandardManager)的应用实现没有pathname 告诉它在哪里将会话存储到磁盘,因此它不会将会话文件写入磁盘(例如在关机时),这是我们想要的。

换句话说,这会禁用标准 Tomcat 功能以通过服务器重启来维持会话。

如何在带有嵌入式 Tomcat 的 Spring Boot 中实现相同的功能?

也许可以通过某种方式获取 Manager 对象以将属性路径名设置为 null?

【问题讨论】:

【参考方案1】:

您可以使用TomcatContextCustomizer 访问管理器并应用必要的配置:

@Bean
public EmbeddedServletContainerFactory servletContainer() 
    TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory();
    tomcat.addContextCustomizers(new TomcatContextCustomizer() 

        @Override
        public void customize(Context context) 
            if (context.getManager() instanceof StandardManager) 
                ((StandardManager) context.getManager()).setPathname("");
            
        
    );
    return tomcat;

【讨论】:

【参考方案2】:

...这适用于 Spring Boot 2.0.x

@Bean
public TomcatServletWebServerFactory servletContainer() 
    TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();
    tomcat.addContextCustomizers(new TomcatContextCustomizer() 

        @Override
        public void customize(Context context) 
            if (context.getManager() instanceof StandardManager) 
                ((StandardManager) context.getManager()).setPathname("");
            
        
    );
    return tomcat;

【讨论】:

【参考方案3】:

可以通过application.properties自定义此行为:

server.servlet.session.persistent=false # Whether to persist session data between restarts.

在 Spring Boot 2.x 中默认禁用会话持久性。

【讨论】:

v2.1.4 docs 支持您所说的默认禁用此功能,但是,我的会话反序列化错误仅在明确将此属性设置为 false 后才消失。看起来文档与代码不同步。【参考方案4】:

或者像这样,如果你使用application.yml

# Whether to persist session data between restarts.
server:
  servlet:
    session:
      persistent: false

【讨论】:

以上是关于如何通过管理器路径名在 Spring Boot 中禁用 Tomcat 会话持久性?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Spring Boot 和 Spring Data 访问实体管理器

如何通过 Spring Boot 的 rest 调用在数据准备好时传输?

如何在 GET 方法中为 Spring Boot 控制器类传递多个路径变量?

Spring Boot 谷歌云秘密管理器

无法在 Spring Boot 2.0.0 中自动装配身份验证管理器

Spring Boot 项目中配置多数据源@Transactional注解失效问题