【问题标题】:How to get actual request URL in routed service when using Zuul service and Spring boot?使用 Zuul 服务和 Spring Boot 时如何在路由服务中获取实际请求 URL?
【发布时间】:2018-12-08 18:10:25
【问题描述】:

我正在使用 zuul 服务作为我所有微服务的 API 网关。

在zuul过滤器中,我可以得到如下的requestUrl:

import javax.servlet.http.HttpServletRequest;
import com.netflix.zuul.context.RequestContext;
.....
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest request = ctx.getRequest();
String requestUrl = request.getRequestURL();

这里requestUrl:http://localhost:8052/api/userservice/users

在用户服务中,当我尝试使用 HttpServletRequest 在 Spring Boot Rest 控制器中获取请求 URL 时:

String requestUrl = request.getRequestURL();

这里requestUrl:http://localhost:8055/userservice/users

我得到的是路由的服务请求 URL,但不是客户端请求的实际 URL。

如何在路由服务中获取实际的请求 URL?

【问题讨论】:

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


    【解决方案1】:

    您正在获取路由服务,因为当您在请求 url 被修改后调用 getRequestURL 方法时。在顺序为-50(例如)的前置过滤器中调用相同的方法,可以得到zuul服务器接收到的实际URL。

    到目前为止,在修改请求后,我还没有找到在路由/后过滤器中获取实际 URL 的任何方法,我认为解决此问题的一种方法是定义一个前置过滤器以在修改前获取实际 URL,并将url放入Threadlocal字段中,然后通过访问该字段即可在route/post过滤器中获取url。

    【讨论】:

      【解决方案2】:

      Zuul 向用户服务创建一个新的 Http 请求。显然有不同的网址。 因此,在用户服务中,不可能通过设计访问原始请求。

      Zuul 应该封装一个原始请求,而不是暴露它。 所有的headers、request参数、request body都应该保留,它只是一个需要改变的路径。

      如果出于某种原因需要从原始请求中获取参数,在 Zuul 过滤器中,可以将它们提取并设置为“新”请求的标头,然后再将其发送给用户服务。 然后在 UserService 中还应该有一个过滤器,它将“读取”这些标头并根据需要使用信息

      【讨论】:

        猜你喜欢
        • 2019-09-11
        • 2016-12-23
        • 2018-08-21
        • 2020-07-15
        • 2021-01-30
        • 2019-07-18
        • 2019-11-07
        • 2020-10-25
        • 1970-01-01
        相关资源
        最近更新 更多