我们在同一个域后面有两个项目(前面是zuul代理),它们都使用Spring会话项目,并且会话保存在redis中。
这两个会话应该是不同的,但似乎他们在名为'SESSION'的cookie中覆盖了彼此的id。如何更改该名称?通过配置有没有简单的方法呢?
答案 0 :(得分:3)
好的,我没有在配置中找到任何属性来改变它。我在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源代码中的默认设置。
答案 1 :(得分:1)
@Bean
public CookieSerializer cookieSerializer() {
DefaultCookieSerializer serializer = new DefaultCookieSerializer();
serializer.setCookieName("YOUR_COOKIE");
serializer.setCookiePath("/");
serializer.setDomainNamePattern("^.+?\\.(\\w+\\.[a-z]+)$");
return serializer;
}
答案 2 :(得分:0)
我发现了一篇关于此事的博文spring-session学习 这篇文章解释了如何使用Spring XML更改会话ID名称。
如下:
<bean class="org.springframework.session.web.http.DefaultCookieSerializer">
<property name="cookieName" value="SYSTEM_SESSION_ID" />
</bean>
并且,我实际测试了它并且它有效。
答案 3 :(得分:0)
我知道这是一个老问题,但是我只想说这个选项也可以。
您可以在您的application.yml中添加server.servlet.session.cookie.name
。看看这个spring docs链接,它具有其他cookie属性,您也可以更改。
答案 4 :(得分:0)
在 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;
}