Spring boot настроить пользовательский jsessionid для встроенного сервера

Я хочу настроить контекст моего сервлета, например установить собственный ключ jsessionId (см. Изменение имени JSESSIONID файла cookie)

Я считаю, что могу использовать SpringBootServletInitializer при запуске файла WAR, манипулируя servletContext в onStartup(). Однако, когда я запускаю встроенный сервер приложений, используя new SpringApplicationBuilder().run(), я не знаю, где лучше всего манипулировать контекстом сервлета.


person tkruse    schedule 18.09.2014    source источник
comment
Я весьма подозрительно отношусь к вашим мотивам. Если вы измените имя файла cookie, вы не сможете, например, воспользоваться преимуществами общих алгоритмов балансировки нагрузки. Я не понимаю, зачем это нужно.   -  person Dave Syer    schedule 18.09.2014
comment
@DaveSyer Мне любопытно, как это повлияет на алгоритм LB? Мы планируем изменить имя файла cookie, чтобы скрыть детали технического стека от злоумышленников.   -  person Govinda Sakhare    schedule 03.08.2019
comment
Например, балансировка нагрузки липкого сеанса обычно зависит от имени файла cookie.   -  person Dave Syer    schedule 14.08.2019


Ответы (4)


Начиная с Spring Boot 1.3, вы можете просто установить свойство конфигурации;

Spring Boot 1.3, 1.4, 1.5

server.session.cookie.name = MYSESSIONID

Spring Boot 2.x

server.servlet.session.cookie.name = MYSESSIONID

Намного проще, чем писать класс конфигурации.

См. https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html для получения дополнительных свойств, связанных с сеансом.

person JamieB    schedule 17.12.2015
comment
Это устарело, новое имя конфигурации - server.servlet.session.cookie.name. - person emazzotta; 17.10.2018

Объявите bean-компонент ServletContextInitializer в конфигурации вашего приложения:

@Bean
public ServletContextInitializer servletContextInitializer() {
    return new ServletContextInitializer() {

        @Override
        public void onStartup(ServletContext servletContext) throws ServletException {
            servletContext.getSessionCookieConfig().setName("yourCookieName");
        }
    };

}

В качестве альтернативы сам класс вашего приложения может реализовать ServletContextInitializer:

@Configuration
@EnableAutoConfiguration
@ComponentScan
public class Application implements ServletContextInitializer {

    public static void main(String[] args) throws Exception {
        SpringApplication.run(Application.class, args);
    }

    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
        servletContext.getSessionCookieConfig().setName("yourCookieName");
    }

}
person Andy Wilkinson    schedule 18.09.2014
comment
Отличная работа, которую мистер Уилкинсон искал уже некоторое время! Продолжайте хорошую работу. - person Lazar Lazarov; 11.01.2017
comment
Пользователи Wildfly: это было единственное решение, которое работало для установки пути JSESSIONID (установка server.servlet.session.cookie.path НЕ работала). - person java-addict301; 24.05.2019
comment
Второе примечание для пользователей Wildfly. Пришлось добавить super.onStartup (servletContext); в начало метода onStartup, иначе моя конфигурация / заголовки CORS были снесены. Tomcat, похоже, в этом не нуждался. - person java-addict301; 24.05.2019
comment
@ java-addict301, вы не можете вызвать super.onStartup(servletContext) в этом случае. Суперкласс анонимного внутреннего класса (мой первый пример) и Application (мой второй пример) - это Object, и у него нет метода onStartup(ServletContext), поэтому попытка вызвать super.onStartup(servletContext) не будет компилироваться. Возможно, у вашего ServletContextInitializer другой суперкласс? - person Andy Wilkinson; 24.05.2019
comment
Ах да, вы правы, я отменяю это в моем основном классе @SpringBootApplication (который расширяет SpringBootServletInitializer). Я использую Spring Boot версии 2.1.1 - person java-addict301; 24.05.2019

с весенним сеансом, если вы хотите изменить имя файла cookie, вы можете сделать это

@Bean
public DefaultCookieSerializer defaultCookieSerializer(){
    DefaultCookieSerializer defaultCookieSerializer = new DefaultCookieSerializer();
    defaultCookieSerializer.setCookieName("mySessionId");
    return defaultCookieSerializer;
}

Я нахожу это в источнике весенней сессии

весна-сессия-1.2.1.RELEASE-sources.jar! /org/springframework/session/config/annotation/web/http/SpringHttpSessionConfiguration.java

    @Autowired(required = false)
public void setCookieSerializer(CookieSerializer cookieSerializer) {
    this.defaultHttpSessionStrategy.setCookieSerializer(cookieSerializer);
}
person jozdoo    schedule 15.02.2017

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
    .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.NEVER).and()
    .csrf().disable();  
}

Вы можете попробовать это, поскольку он удаляет идентификатор jsession из URL-адреса

person bhagyashri S. I.    schedule 08.06.2018
comment
Убейте пациента, если он болен. Хороший ответ - person iamareebjamal; 21.08.2018
comment
@iamareebjamal хахахха! сделал мой день: D - person Arny; 04.05.2019