Spring Cloud Gateway的Cookies路径

时间:2019-04-26 14:26:59

标签: spring cookies spring-cloud jsessionid spring-cloud-gateway

使用 Spring Boot 2.1.2 Spring Cloud Greenwich.RELEASE 来考虑基于 microservices 的应用程序:

  • 每个微服务都使用 JSESSIONID cookie 来标识其自己的专用Servlet会话(即,没有与Spring Session和Redis共享的全局唯一会话)。
  • 外部传入请求由 Spring Cloud Gateway (以及通过Spring Cloud Netflix使用的Eureka注册中心,路由,但这不相关)。

Spring Cloud Gateway返回微服务响应时,它将按原样返回“ Set-Cookie”,即具有相同的“ /”路径。

当客户端调用第二个微服务时,来自第一个微服务的JSESSIONID被转发但被忽略(因为相应的会话仅存在于第一个微服务中)。因此,第二个微服务将返回一个新的JSESSIONID。结果,第一次会话丢失了。

总而言之,每次调用不同的微服务都会失去上一个会话

我期望使用Spring Cloud Gateway进行一些cookie路径转换,但是在文档中没有找到这样的功能。谷歌也不走运。

我们如何解决此问题(我可能会错过的配置参数, 编写此类cookie路径翻译等的API)?

2 个答案:

答案 0 :(得分:0)

我没有更改GlobalFilter中的JSESSIONID cookie路径,而只是更改了application.yml中cookie的名称:

# Each microservice uses its own session cookie name to prevent conflicts
server.servlet.session.cookie.name: JSESSIONID_${spring.application.name}

答案 1 :(得分:-1)

在网关项目中只需将cookie名称重置为GATEWAY_SESSION即可避免会话冲突:

    @Autowired(required = false)
    public void setCookieName(HttpHandler httpHandler) {
        if (httpHandler == null) return;
        if (!(httpHandler instanceof HttpWebHandlerAdapter)) return;
        DefaultWebSessionManager sessionManager = new DefaultWebSessionManager();
        CookieWebSessionIdResolver sessionIdResolver = new CookieWebSessionIdResolver();
        sessionIdResolver.setCookieName("GATEWAY_SESSION");
        sessionManager.setSessionIdResolver(sessionIdResolver);
        ((HttpWebHandlerAdapter) httpHandler).setSessionManager(sessionManager);
    }