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 应用程序设置自定义 Http 标头“服务器”