当通过Zuul向客户端发送请求时,Zuul似乎更改了查询字符串。更具体地说,如果客户端应该接收url编码的查询字符串,则Zuul会对查询字符串进行一次解码。这是一个具体的例子:
如果" http://localhost:8080/demo/demo?a=http%3A%2F%2Fsomething/"被发送到客户端,客户端接收查询字符串" a = http://something/"。
查看Zuul的代码,函数" buildZuulRequestQueryParams"使用" HTTPRequestUtils.getInstance()。getQueryParams();"它解码查询字符串。
这是一个理想的功能还是一个错误?
答案 0 :(得分:3)
Zuul实际上提供了一个标志来禁用此行为。
8.9查询字符串编码 处理传入请求时,将对查询参数进行解码,以便它们可用于Zuul过滤器中的可能修改。然后对它们进行重新编码,后端请求在路由过滤器中重建。如果(例如)它是使用Javascript的encodeURIComponent()方法编码的,则结果可能与原始输入不同。虽然这在大多数情况下不会引起任何问题,但某些Web服务器可能会因复杂查询字符串的编码而变得挑剔。
要强制查询字符串的原始编码,可以将特殊标志传递给ZuulProperties,以便使用HttpServletRequest :: getQueryString方法按原样获取查询字符串,如以下示例所示:
application.yml。
zuul:
forceOriginalQueryStringEncoding: true
[注意]此特殊标志仅适用于SimpleHostRoutingFilter。 此外,您无法轻松覆盖查询参数 RequestContext.getCurrentContext()。setRequestQueryParams(someOverriddenParameters) 因为查询字符串现在直接在原始字符串上提取 HttpServletRequest的。
答案 1 :(得分:0)
昨天我遇到了同样的问题。我认为这与pull request有关。解决此问题的更快方法(无需等待PR合并)是使用相同的包和类名重写您自己项目中的类以覆盖框架类。
答案 2 :(得分:0)
我最近遇到了同样的问题。向Netflix/Zuul提交了PR。基本上增加了与Netflix在Spring Cloud Gateway上当前可用的功能。希望能尽快解决。
如果被接受,您几乎可以添加一个配置来保留原始的uri编码
zuul.keepOriginalQueryStringEncoding=true