Как отключить сохранение сеанса Tomcat при загрузке Spring с помощью пути к менеджеру?

#java #spring-boot #spring-security

#tomcat #spring-boot

Вопрос:

В Tomcat есть хорошо известная опция конфигурации conf/context.xml для отключения сохранения сеанса:

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

При раскомментировании, как показано здесь, прикладная реализация org.apache.catalina.Manager (например org.apache.catalina.session.StandardManager ) не имеет a pathname , чтобы указать, где хранить сеансы на диске, и, следовательно, она не записывает файлы сеансов на диск (например, при завершении работы), чего мы и хотим.

Другими словами, это отключает стандартную функцию Tomcat для поддержания сеансов при перезапуске сервера.

Как то же самое может быть достигнуто в Spring Boot со встроенным Tomcat?

Возможно, объект Manager можно каким-то образом получить, чтобы присвоить свойству pathname значение null?

Ответ №1:

Вы можете использовать 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;
}
  

Ответ №2:

Это поведение можно настроить с помощью application.properties :

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

Сохранение сеанса по умолчанию отключено в Spring Boot 2.x.

Комментарии:

1. Документы версии v2.1.4 поддерживают то, что вы говорите о том, что это отключено по умолчанию, однако мои ошибки десериализации сеанса исчезли только после явного присвоения этому свойству значения false. Похоже, документы не соответствуют коду.

2. То же самое, мне пришлось явно установить это, чтобы отключить сохранение сеанса. Похоже, по умолчанию он не отключен.

Ответ №3:

… и это для 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;
}
  

Ответ №4:

Или вот так, в случае, если вы используете application.yml :

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