【问题标题】:spring session sharing between zuul and resource serverszuul和资源服务器之间的spring session共享
【发布时间】:2017-09-23 07:57:08
【问题描述】:

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

基本上,我们将 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 相应服务的请求。

非常感谢您的任何建议

【问题讨论】:

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


    【解决方案1】:

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

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

    添加上述代码后,将zuul过滤器cookie中的session_id传递给各个微服务,就可以从zuul过滤器中获取session_id了。

    【讨论】:

      【解决方案2】:

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

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

      you can see more details at this link

      【讨论】:

        【解决方案3】:

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

        以下是 zuul 对未传递给下游服务器的敏感标头的默认配置。 zuul.sensitiveHeaders=Cookie,Set-Cookie,Authorization

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

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

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

        【讨论】:

        • 感谢您的回复,问题已解决,现在我面临另一个问题,是否无法从 zuul 过滤器重定向到 remoteULR。 context.setRouteHost( new URL(<remoteURL>));你对这个问题有什么想法吗?
        【解决方案4】:

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

        @Override
        public int filterOrder() {
            return 10;
        }
        

        更多详情请查看以下示例 https://stackoverflow.com/a/54833734/11103297

        【讨论】:

          【解决方案5】:

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

          声明一个bean HttpSessionIdResolver

           HeaderHttpSessionIdResolver.xAuthToken()
          

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

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

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

          【讨论】:

            猜你喜欢
            • 2018-10-13
            • 2017-01-17
            • 2012-07-06
            • 2017-05-09
            • 1970-01-01
            • 2018-09-15
            • 2013-04-01
            • 1970-01-01
            • 2016-06-27
            相关资源
            最近更新 更多