通过Zuul向客户端发送请求时,Zuul似乎更改了查询字符串。更具体地说,如果客户端应该收到一个URL编码的查询字符串,则Zuul会对查询字符串解码一次。这是一个具体的例子:
如果将“ http:// localhost:8080 / demo / demo?a = http%3A%2F%2Fsomething / ”发送给客户端,则客户端将作为查询字符串“ a = http:// something / ”。
查看Zuul的代码,函数“ buildZuulRequestQueryParams”使用“ HTTPRequestUtils.getInstance()。getQueryParams();” 它将查询字符串解码。
这是所需的功能还是错误?
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 上获取查询字符串。
| 归档时间: |
|
| 查看次数: |
1791 次 |
| 最近记录: |