我们在同一个域后面有两个项目(它们前面的 zuul 代理),都使用 spring 会话项目,会话保存在 redis 中。
这两个会话应该不同,但似乎它们在名为“SESSION”的 cookie 中覆盖了彼此的 id。怎么改这个名字?有没有简单的方法通过配置来做到这一点?
我们在同一个域后面有两个项目(它们前面的 zuul 代理),都使用 spring 会话项目,会话保存在 redis 中。
这两个会话应该不同,但似乎它们在名为“SESSION”的 cookie 中覆盖了彼此的 id。怎么改这个名字?有没有简单的方法通过配置来做到这一点?
我知道这是一个老问题,但我只想说这个选项也有效。
您可以添加server.servlet.session.cookie.name
您的 application.yml。看看这个 spring 文档链接,它还有其他 cookie 属性,您也可以更改。
好的,我没有在配置中找到任何属性来改变它。我在 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 源中的默认设置。
我找到了一篇关于这个的博文,spring-session 学习
这篇博文解释了如何使用 Spring XML 更改 session 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;
}
在 Spring Boot Web ( spring-boot-starter-web
) 中,您有一个名为server.servlet.session.cookie.name
which work fine 的属性,但对我来说,默认情况下该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;
}