【问题标题】:Netflix Zuul query string encodingNetflix Zuul 查询字符串编码
【发布时间】:2016-07-28 07:33:37
【问题描述】:

当通过 Zuul 向客户端发送请求时,Zuul 似乎更改了查询字符串。更具体地说,如果客户端应该收到一个 url 编码的查询字符串,Zuul 会对该查询字符串进行一次解码。这是一个具体的例子:

如果“http://localhost:8080/demo/demo?a=http%3A%2F%2Fsomething/”被发送到客户端,客户端会收到一个查询字符串“a=http://something/”。

查看 Zuul 的代码,函数“buildZuulRequestQueryParams”使用“HTTPRequestUtils.getInstance().getQueryParams();”它解码查询字符串。

这是一个期望的功能还是一个错误?

【问题讨论】:

    标签: netflix-zuul


    【解决方案1】:

    我最近遇到了同样的问题。向Netflix/Zuul 提交了 PR。基本上将 Spring Cloud Gateway 上当前可用的相同功能添加到 Netflix。希望它会尽快得到解决。

    如果接受,您几乎可以添加一个配置以保留原始 uri 编码

    zuul.keepOriginalQueryStringEncoding=true
    

    【讨论】:

      【解决方案2】:

      Zuul 实际上提供了一个标志来禁用此行为。

      8.9 查询字符串编码 在处理传入请求时,查询参数被解码,以便它们可用于 Zuul 过滤器中的可能修改。然后它们被重新编码,后端请求在路由过滤器中重建。如果(例如)使用 Javascript 的 encodeURIComponent() 方法对结果进行编码,则结果可能与原始输入不同。虽然这在大多数情况下不会引起任何问题,但某些 Web 服务器可能对复杂查询字符串的编码很挑剔。

      要强制查询字符串的原始编码,可以向 ZuulProperties 传递一个特殊的标志,以便使用 HttpServletRequest::getQueryString 方法获取查询字符串,如下例所示:

      application.yml.

       zuul:
        forceOriginalQueryStringEncoding: true
      

      [注意] 此特殊标志仅适用于 SimpleHostRoutingFilter。 此外,您失去了轻松覆盖查询参数的能力 RequestContext.getCurrentContext().setRequestQueryParams(someOverriddenParameters), 因为查询字符串现在直接在原始上获取 HttpServletRequest。

      8. Router and Filter: Zuul

      【讨论】:

      • 为什么他们会默认将此标志设置为“假”?嗯..
      【解决方案3】:

      我昨天也遇到了同样的问题。我认为这与pull request 有关。解决此问题的更快方法(无需等待 PR 合并)是使用相同的包和类名重写您自己项目中的类以覆盖框架类。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-06-15
        • 1970-01-01
        • 1970-01-01
        • 2011-06-16
        • 1970-01-01
        • 1970-01-01
        • 2017-11-01
        相关资源
        最近更新 更多