zuul和资源服务器之间的spring会话共享

时间:2017-04-26 04:50:08

标签: spring-boot netflix-zuul spring-session

我试图搜索,但找不到适合我们情况的答案。

基本上,我们有zuul服务器作为API网关,它遵循责任

+ Autheticate user, and create and maintain session with users
+ Sessions will be stored in redis (we are using spring session with redis)

我希望所有资源服务器都能访问由zuul服务器创建的会话信息。但我无法从资源服务器获取会话信息。它总是返回null,我检查了redis服务器,看到会话是由zuul服务器创建的

请注意,我们正在使用Netflix服务发现转发来自Zuul各自服务的请求。

高度赞赏任何建议

5 个答案:

答案 0 :(得分:0)

即使您在Redis中存储会话,会话ID也存储在cookie中,并且必须传递到资源服务器。但是zuul的默认配置是过滤掉所有与cookie相关的标题。

以下是zuul的默认配置,用于不传递给下游服务器的senstive-headers。 zuul.sensitiveHeaders=Cookie,Set-Cookie,Authorization

要将zuul中与cookie相关的标头传递到您的资源服务器,您需要重新定义它,而不需要像下面这样的cookie相关标头。 zuul.sensitiveHeaders=Authorization

以上示例使用全局配置。您可以为每条路线定义它。请参阅链接文档中的“Cookie和敏感标题”部分:http://cloud.spring.io/spring-cloud-netflix/spring-cloud-netflix.html

如果您还需要在资源服务器中授权标头,则可以使用空白列表定义上述配置。

答案 1 :(得分:0)

实际上我错过了以下代码。

context.addZuulRequestHeader("Cookie", "SESSION=" +  httpSession.getId());

在添加上面的代码以将cookie中的session_id从zuul过滤器传递到相应的微服务之后,它能够从zuul过滤器中拾取session_id。

答案 2 :(得分:0)

确保您使用的过滤器超过5

public int filterOrder() {
    return 10;
}```
for more detail find the below example
https://stackoverflow.com/a/54833734/11103297

答案 3 :(得分:0)

我有同样的问题。但是,在我将application.yml配置为将“ sensitiveHeaders”设置为空之后。我的问题解决了! :)

zuul:
  routes:
    users:
      path: /myusers/**
      sensitiveHeaders:
      url: https://downstream

you can see more details at this link

答案 4 :(得分:0)

在微服务应用中使用 Spring Session 和 Spring Security 保护 API 时,很容易设置使用请求头来解析会话,用法与 OAuth2 opaque token 非常相似。

声明一个 bean HttpSessionIdResolver

 HeaderHttpSessionIdResolver.xAuthToken()
<块引用>

注意:这是针对 Spring MVC 的。它将解析 HTTP 标头 x-auth-token

当从客户端发送请求时,在网关中,将标头 x-auth-token 传递给下游服务/组件。

一个工作示例:hantsy/spring-microservice-sample(但在这个示例应用程序中我没有像网关那样使用 Zuul,我只是使用 Nginx 作为备用代理)