Netflix Zuul查询字符串编码

时间:2016-04-07 12:13:14

标签: netflix-zuul

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

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

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

这是一个理想的功能还是一个错误?

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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

zuul.keepOriginalQueryStringEncoding=true