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

sou*_*ick 17 tomcat spring-boot

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

<!-- Uncomment this to disable session persistence across Tomcat restarts -->
<Manager pathname="" />
Run Code Online (Sandbox Code Playgroud)

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

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

如何在嵌入式Tomcat的Spring Boot中实现同样的目标?

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

And*_*son 15

您可以使用a 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;
}
Run Code Online (Sandbox Code Playgroud)


Tho*_*mas 6

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

server.servlet.session.persistent=false # Whether to persist session data between restarts.
Run Code Online (Sandbox Code Playgroud)

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

  • [v2.1.4 文档](https://docs.spring.io/spring-boot/docs/2.1.4.RELEASE/reference/html/common-application-properties.html) 支持您对此的说法但是,默认情况下禁用,只有在显式将此属性设置为 false 后,我的会话反序列化错误才消失。看来文档与代码不一致。 (2认同)