我们收到一个 get 请求,该请求在 url 中发送字符串字符,因此我们使用路径变量来接收它们。显然,调用服务无法更改其调用后端的方法,因此我们需要能够接受包含以下未编码字符的 url:
当发送百分号 % 时,将返回 http 400。如果 % 后面的两个字符组成 UTF 编码字符,则它确实通过
反斜杠转换为正斜杠。我需要它保留反斜杠。
我猜这些可能是 Tomcat 或 servlet 配置问题。
(春季启动版本1.5.14.RELEASE)
如果你正确地对百分号 (%) 进行 URL 编码(%25
)。然而,斜杠和反斜杠在 Tomcat 中不起作用,即使您对它们进行了编码(%2F
and %5C
).
您可以在运行应用程序时设置以下属性:
-Dorg.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true
-Dorg.apache.catalina.connector.CoyoteAdapter.ALLOW_BACKSLASH=true
但是,这并不能解决问题,因为在这种情况下,这些编码的斜杠将被识别为真实的斜杠。因此,假设您有以下控制器:
@ResponseBody
@RequestMapping("/api/{foo}")
public String getFoo(@PathVariable String foo) {
return foo;
}
好吧,那么如果你打电话/api/test%5Ctest
,它将无法找到正确的路径。解决此问题的方法是使用通配符匹配器并从传入的 URL 本身解析HttpServletRequest
:
@RequestMapping("/api/**")
public String getFoo(HttpServletRequest request) {
// ...
}
另一个解决方案是使用完全不同的 Web 容器。例如,当使用 Jetty 时,这根本不是问题,URL 编码的斜杠和反斜杠都可以工作。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)