如何通过管理器路径名在 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 控制器类传递多个路径变量?