如何更改spring session(redis)cookie名称?

时间:2015-10-13 06:11:24

标签: spring redis spring-session

我们在同一个域后面有两个项目(前面是zuul代理),它们都使用Spring会话项目,并且会话保存在redis中。

这两个会话应该是不同的,但似乎他们在名为'SESSION'的cookie中覆盖了彼此的id。如何更改该名称?通过配置有没有简单的方法呢?

5 个答案:

答案 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属性,您也可以更改。

Spring Common Application Properties

答案 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;
  }