我想配置我的 servlet 上下文,例如设置自定义 jsessionId 键(请参阅更改 cookie JSESSIONID 名称)
我相信我可以在运行 WAR 文件时使用
SpringBootServletInitializer
,操作 servletContext
中的 onStartup()
。但是,当我在嵌入式应用程序服务器上运行时,使用
new SpringApplicationBuilder().run()
,我不知道操作servlet上下文的最佳位置。
从Spring Boot 1.3开始,您可以简单地设置一个配置属性;
Spring Boot 1.3、1.4、1.5
server.session.cookie.name = MYSESSIONID
Spring Boot 2.x、3.x
server.servlet.session.cookie.name = MYSESSIONID
Spring Boot WebFlux 2.x、3.x
server.reactive.session.cookie.name = MYSESSIONID
比编写配置类简单多了。
请参阅 https://docs.spring.io/spring-boot/appendix/application-properties/index.html#application-properties.server.server.reactive.session.cookie.name 了解更多与会话相关的属性。
在应用程序的配置中声明一个
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");
}
}
在 Spring 会话中,如果你想更改 cookie 名称,你可以这样做
@Bean
public DefaultCookieSerializer defaultCookieSerializer(){
DefaultCookieSerializer defaultCookieSerializer = new DefaultCookieSerializer();
defaultCookieSerializer.setCookieName("mySessionId");
return defaultCookieSerializer;
}
我在 Spring 会话源中找到了这个
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);
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.NEVER).and()
.csrf().disable();
}
您可以尝试此操作,因为它会从 URL 中删除 jsession id