2

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

这两个会话应该不同,但似乎它们在名为“SESSION”的 cookie 中覆盖了彼此的 id。怎么改这个名字?有没有简单的方法通过配置来做到这一点?

4

5 回答 5

4

我知道这是一个老问题,但我只想说这个选项也有效。

您可以添加server.servlet.session.cookie.name您的 application.yml。看看这个 spring 文档链接,它还有其他 cookie 属性,您也可以更改。

Spring 常用应用程序属性

于 2019-11-27T19:55:21.993 回答
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 源中的默认设置。

于 2015-10-13T08:31:39.717 回答
1

我找到了一篇关于这个的博文,spring-session 学习
这篇博文解释了如何使用 Spring XML 更改 session id 名称。

如下所示:

<bean class="org.springframework.session.web.http.DefaultCookieSerializer">
        <property name="cookieName" value="SYSTEM_SESSION_ID" />
</bean>

而且,我实际上测试了它并且它有效。

于 2017-01-16T02:00:14.423 回答
1
@Bean
public CookieSerializer cookieSerializer() {
    DefaultCookieSerializer serializer = new DefaultCookieSerializer();
    serializer.setCookieName("YOUR_COOKIE");
    serializer.setCookiePath("/");
    serializer.setDomainNamePattern("^.+?\\.(\\w+\\.[a-z]+)$");
    return serializer;
}
于 2018-04-24T01:13:19.250 回答
0

在 Spring Boot Web ( spring-boot-starter-web) 中,您有一个名为server.servlet.session.cookie.namewhich work fine 的属性,但对我来说,默认情况下该server.servlet.session.cookie.name属性不适用于 Spring Boot WebFlux(spring-boot-starter-webfluxSpring 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;
  }
于 2021-08-04T11:58:04.373 回答