Spring Boot 为嵌入式服务器配置自定义 jsessionid

Posted

技术标签:

【中文标题】Spring Boot 为嵌入式服务器配置自定义 jsessionid【英文标题】:Spring boot configure custom jsessionid for embedded server 【发布时间】:2014-11-13 03:24:03 【问题描述】:

我想配置我的 servlet 上下文,例如设置自定义 jsessionId 键(请参阅Changing cookie JSESSIONID name)

我相信我可以在运行 WAR 文件时使用SpringBootServletInitializer,在onStartup() 中操作servletContext。但是,当我在嵌入式应用程序服务器上运行时,使用 new SpringApplicationBuilder().run(),我不知道操作 servlet 上下文的最佳位置。

【问题讨论】:

我很怀疑你的动机。例如,如果您更改 cookie 名称,您将无法利用常见的负载平衡算法。我真的不明白为什么它是必要的。 @DaveSyer 我很好奇,它怎么会影响LB算法?我们计划更改 cookie 名称以向攻击者隐藏技术堆栈详细信息。 例如,粘性会话负载平衡通常依赖于 cookie 名称。 【参考方案1】:

在应用程序的配置中声明一个ServletContextInitializer bean:

@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");
    


【讨论】:

很好,Wilkinson 先生已经搜索了一段时间了!继续努力。 Wildfly 用户:这是设置 JSESSIONID 路径的唯一解决方案(设置 server.servlet.session.cookie.path 没有)。 Wildfly 用户的第二个注意事项。我不得不添加 super.onStartup(servletContext);到 onStartup 方法的开头,否则我的 CORS 配置/标题会被吹走。 Tomcat 似乎不需要这个。 @java-addict301,在这种情况下你不能调用super.onStartup(servletContext)。匿名内部类(我的第一个示例)和Application(我的第二个示例)的超类是Object,它没有onStartup(ServletContext) 方法,因此尝试调用super.onStartup(servletContext) 将无法编译。也许你的ServletContextInitializer 有不同的超类? 啊,是的,你是对的,我在我的主 @SpringBootApplication 类(它扩展了 SpringBootServletInitializer)中覆盖了它。我使用的是 Spring Boot 2.1.1 版【参考方案2】:

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。

【讨论】:

这个已弃用,新配置名称为server.servlet.session.cookie.name【参考方案3】:
@Override
protected void configure(HttpSecurity http) throws Exception 
    http
    .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.NEVER).and()
    .csrf().disable();  

你可以试试这个,因为它会从 URL 中删除 jsession id

【讨论】:

如果病人有病就杀死他。不错的答案 @iamareebjamal 哈哈哈!成就了我的一天:D【参考方案4】:

使用spring session,如果你想改变cookie名称,你可以这样做

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

我在春季会话源中找到了这个

spring-session-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);

【讨论】:

以上是关于Spring Boot 为嵌入式服务器配置自定义 jsessionid的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot使用嵌入式容器,那怎么配置自定义Filter呢

Spring-Boot使用嵌入式容器,那怎么配置自定义Filter呢

如何配置Spring Boot Tomcat

如何为 Spring Boot 应用程序设置自定义 Http 标头“服务器”

Spring Boot 内嵌启动脚本配置(Customizing the startup script)

Spring Boot主要目标