使用 Spring Boot 2.1.2 和 Spring Cloud Greenwich.RELEASE 来考虑基于 microservices 的应用程序:
Spring Cloud Gateway返回微服务响应时,它将按原样返回“ Set-Cookie”,即具有相同的“ /”路径。
当客户端调用第二个微服务时,来自第一个微服务的JSESSIONID被转发但被忽略(因为相应的会话仅存在于第一个微服务中)。因此,第二个微服务将返回一个新的JSESSIONID。结果,第一次会话丢失了。
总而言之,每次调用不同的微服务都会失去上一个会话。
我期望使用Spring Cloud Gateway进行一些cookie路径转换,但是在文档中没有找到这样的功能。谷歌也不走运。
我们如何解决此问题(我可能会错过的配置参数, 编写此类cookie路径翻译等的API)?
答案 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);
}