Netflix Zuul查询字符串编码

alb*_*oll 5 netflix-zuul

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

如果将“ http:// localhost:8080 / demo / demo?a = http%3A%2F%2Fsomething / ”发送给客户端,则客户端将作为查询字符串“ a = http:// something / ”。

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

这是所需的功能还是错误?

Alw*_*ing 8

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

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

要强制对查询字符串进行原始编码,可以将特殊标志传递给 ZuulProperties,以便使用 HttpServletRequest::getQueryString 方法按原样采用查询字符串,如以下示例所示:

应用程序.yml。

 zuul:
  forceOriginalQueryStringEncoding: true
Run Code Online (Sandbox Code Playgroud)

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

8. 路由器和过滤器:Zuul


Mar*_*ero 0

我昨天面临同样的问题。我认为这与这个拉取请求有关。解决此问题的更快方法(无需等待 PR 合并)是使用相同的包和类名重写您自己项目中的类来覆盖框架类。