如何更改 spring 会话(redis)cookie 名称?
How to change spring session (redis) cookie name?
我们在同一个域后面有两个项目(zuul 代理在它们前面),都使用 spring 会话项目,会话保存在 redis 中。
这两个会话应该是不同的,但似乎它们正在覆盖名为 'SESSION' 的 cookie 中的彼此 ID。这个名字怎么改?有什么简单的方法可以通过配置来实现吗?
好的,我没有在配置中找到任何 属性 来改变它。我深入研究了 spring-session 源代码,最后做了:
@Bean
public <S extends ExpiringSession> SessionRepositoryFilter<? extends ExpiringSession> springSessionRepositoryFilter(SessionRepository<S> sessionRepository, ServletContext servletContext) {
SessionRepositoryFilter<S> sessionRepositoryFilter = new SessionRepositoryFilter<S>(sessionRepository);
sessionRepositoryFilter.setServletContext(servletContext);
CookieHttpSessionStrategy httpSessionStrategy = new CookieHttpSessionStrategy();
httpSessionStrategy.setCookieName("MY_SESSION_NAME");
sessionRepositoryFilter.setHttpSessionStrategy(httpSessionStrategy);
return sessionRepositoryFilter;
}
"SESSION"名称是 CookieHttpSessionStrategy 源中的默认设置。
我找到了一篇关于此的博客 post,spring-session学习
post 解释了如何使用 Spring XML 更改会话 ID 名称。
喜欢以下内容:
<bean class="org.springframework.session.web.http.DefaultCookieSerializer">
<property name="cookieName" value="SYSTEM_SESSION_ID" />
</bean>
而且,我实际测试过它并且有效。
@Bean
public CookieSerializer cookieSerializer() {
DefaultCookieSerializer serializer = new DefaultCookieSerializer();
serializer.setCookieName("YOUR_COOKIE");
serializer.setCookiePath("/");
serializer.setDomainNamePattern("^.+?\.(\w+\.[a-z]+)$");
return serializer;
}
我知道这是一个老问题,但我只想说这个选项也有效。
您可以在 application.yml 中添加 server.servlet.session.cookie.name
。看看这个 spring 文档 link,它还有其他您可以更改的 cookie 属性。
在 Spring Boot Web (spring-boot-starter-web
) 中,您将 属性 命名为 server.servlet.session.cookie.name
,它工作正常,但对我来说
事实证明,server.servlet.session.cookie.name
属性 默认情况下不适用于 Spring Boot WebFlux(spring-boot-starter-webflux
Spring Boot v2.5.2,Spring v5。 3.8).我创建了一个使用它的 WebSessionManager
bean:
@Bean
public WebSessionManager webSessionManager(
final ServerProperties serverProperties, final WebFluxProperties webFluxProperties) {
final DefaultWebSessionManager webSessionManager = new DefaultWebSessionManager();
final CookieWebSessionIdResolver webSessionIdResolver = new CookieWebSessionIdResolver();
webSessionIdResolver.setCookieName(
serverProperties.getServlet().getSession().getCookie().getName());
webSessionIdResolver.addCookieInitializer(
(cookie) -> {
cookie.sameSite(webFluxProperties.getSession().getCookie().getSameSite().attribute());
});
webSessionManager.setSessionIdResolver(webSessionIdResolver);
return webSessionManager;
}
似乎 Spring 现在支持一些 yaml 属性来设置 fine-grained webflux/反应服务器上的 cookie 和会话的属性(例如 Spring 基于网关的应用程序)。
参考 this request 他们实现了一组双重属性:
- spring.webflux.session(弃用以支持下一个)
- server.reactive.session
我能够在 application.yaml:
中写入这一行来设置 cookie 名称
server.reactive.session.cookie.name: "MYSESSIONID"
我们在同一个域后面有两个项目(zuul 代理在它们前面),都使用 spring 会话项目,会话保存在 redis 中。
这两个会话应该是不同的,但似乎它们正在覆盖名为 'SESSION' 的 cookie 中的彼此 ID。这个名字怎么改?有什么简单的方法可以通过配置来实现吗?
好的,我没有在配置中找到任何 属性 来改变它。我深入研究了 spring-session 源代码,最后做了:
@Bean
public <S extends ExpiringSession> SessionRepositoryFilter<? extends ExpiringSession> springSessionRepositoryFilter(SessionRepository<S> sessionRepository, ServletContext servletContext) {
SessionRepositoryFilter<S> sessionRepositoryFilter = new SessionRepositoryFilter<S>(sessionRepository);
sessionRepositoryFilter.setServletContext(servletContext);
CookieHttpSessionStrategy httpSessionStrategy = new CookieHttpSessionStrategy();
httpSessionStrategy.setCookieName("MY_SESSION_NAME");
sessionRepositoryFilter.setHttpSessionStrategy(httpSessionStrategy);
return sessionRepositoryFilter;
}
"SESSION"名称是 CookieHttpSessionStrategy 源中的默认设置。
我找到了一篇关于此的博客 post,spring-session学习
post 解释了如何使用 Spring XML 更改会话 ID 名称。
喜欢以下内容:
<bean class="org.springframework.session.web.http.DefaultCookieSerializer">
<property name="cookieName" value="SYSTEM_SESSION_ID" />
</bean>
而且,我实际测试过它并且有效。
@Bean
public CookieSerializer cookieSerializer() {
DefaultCookieSerializer serializer = new DefaultCookieSerializer();
serializer.setCookieName("YOUR_COOKIE");
serializer.setCookiePath("/");
serializer.setDomainNamePattern("^.+?\.(\w+\.[a-z]+)$");
return serializer;
}
我知道这是一个老问题,但我只想说这个选项也有效。
您可以在 application.yml 中添加 server.servlet.session.cookie.name
。看看这个 spring 文档 link,它还有其他您可以更改的 cookie 属性。
在 Spring Boot Web (spring-boot-starter-web
) 中,您将 属性 命名为 server.servlet.session.cookie.name
,它工作正常,但对我来说
事实证明,server.servlet.session.cookie.name
属性 默认情况下不适用于 Spring Boot WebFlux(spring-boot-starter-webflux
Spring Boot v2.5.2,Spring v5。 3.8).我创建了一个使用它的 WebSessionManager
bean:
@Bean
public WebSessionManager webSessionManager(
final ServerProperties serverProperties, final WebFluxProperties webFluxProperties) {
final DefaultWebSessionManager webSessionManager = new DefaultWebSessionManager();
final CookieWebSessionIdResolver webSessionIdResolver = new CookieWebSessionIdResolver();
webSessionIdResolver.setCookieName(
serverProperties.getServlet().getSession().getCookie().getName());
webSessionIdResolver.addCookieInitializer(
(cookie) -> {
cookie.sameSite(webFluxProperties.getSession().getCookie().getSameSite().attribute());
});
webSessionManager.setSessionIdResolver(webSessionIdResolver);
return webSessionManager;
}
似乎 Spring 现在支持一些 yaml 属性来设置 fine-grained webflux/反应服务器上的 cookie 和会话的属性(例如 Spring 基于网关的应用程序)。
参考 this request 他们实现了一组双重属性:
- spring.webflux.session(弃用以支持下一个)
- server.reactive.session
我能够在 application.yaml:
中写入这一行来设置 cookie 名称server.reactive.session.cookie.name: "MYSESSIONID"