我试图搜索,但找不到适合我们情况的答案。
基本上,我们有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各自服务的请求。
高度赞赏任何建议
答案 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
答案 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 作为备用代理)