如何更改 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 Common Application Properties

在 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"