rest - Springboot 不允许通过 URL 中的百分比和反斜杠
问题描述
我们收到了一个在 url 中发送字符串字符的 get 请求,因此我们使用路径变量来接收它们。显然,调用服务无法更改其调用后端的方法,因此我们需要能够接受具有以下未编码字符的 url:
当发送百分号 % 时,将返回 http 400。如果 % 后面的两个字符组成一个 UTF 编码字符,它确实会通过
反斜杠转换为正斜杠。我需要它来保持反斜杠。
我猜这些可能是 Tomcat 或 servlet 配置问题。
(春季启动版本 1.5.14.RELEASE)
解决方案
如果您正确地对它们进行 URL 编码,百分号 (%) 应该没有问题 ( %25
)。但是,斜杠和反斜杠不适用于 Tomcat,即使您对它们进行了编码(%2F
和%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 中解析 URL 本身HttpServletRequest
:
@RequestMapping("/api/**")
public String getFoo(HttpServletRequest request) {
// ...
}
另一种解决方案是使用完全不同的 Web 容器。例如,在使用 Jetty 时,这根本不是问题,并且 URL 编码的斜杠和反斜杠都可以工作。
推荐阅读
- linux - Linux Rider 新解决方案只有空解决方案
- c++ - Vulkan 中的描述符集计数歧义
- python - 如何使用 Python SDK 访问 Azure AD?
- python - 为什么我的 python 2.7 进程使用大量内存?
- angular - Angular Material MatChipList 点击获取所有选中的芯片
- python - 重塑数据框以提取特定结果
- python - python pandas在数据框列中添加列表作为默认值
- node.js - Nodejs WebService 数据库选择
- javascript - 如何将多个输入添加到对象以在 ReactJS 中呈现
- sql - 如何从与 FK 链接的两个不同表中删除记录?SQL