【发布时间】:2023-03-10 23:21:01
【问题描述】:
我正在尝试让我的 Spring 4 应用程序允许路径参数以转义斜杠结束。
我得到的@RequestMapping 是:
@RequestMapping("/{externalSystemId}/{externalRequestId}/events")
我调用的 URL 是 /dummy/ab%2F/events。所以“externalRequestId”是带有尾随编码斜杠的那个。
我已经到了正确调用处理程序的地步,并且路径段中间的转义斜杠起作用 - 例如/dummy/ab%2Fcd/events,但不是最后。
到目前为止我做了什么:
- 为 Tomcat 添加了系统属性:
- -Dorg.apache.catalina.connector.CoyoteAdapter.ALLOW_BACKSLASH=true
- -Dorg.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true
-
UrlPathHelper的自定义扩展,将getServletPath替换为仅返回request.getRequestURI()的扩展 - 将 UrlPathHelper 配置为:
- urlDecode = 假
- removeSemicolonContent = false
- 使用来自
mvc:path-matching的UrlPathHelper,在mvc:annotation-driven内
我完全不知道下一步该去哪里。我什至一直在通过 Spring 和 Tomcat 进行调试以尝试解决它,但我很难过。 看起来是因为UrlPathHelper.getPathWithinServletMapping() 正在调用request.getPathInfo(),并且返回的是去掉了%2F 的路径。这反过来又是因为 Tomcat 中的其他地方——我现在已经丢失了窗口——它已经将 %2F 解码为 /,然后用“/”替换了现在存在的“//”。
这感觉应该是比较简单的,那我错过了什么?
我已经在 Tomcat 7 和 Tomcat 8 以及各种版本的 Spring 4 上尝试过它——目前是 4.3.14。
【问题讨论】:
标签: java spring spring-mvc tomcat