Spring 4路径参数末尾带转义斜杠的配置问题
解决Spring 4路径参数末尾带编码斜杠(%2F)的识别问题
这个问题我之前也碰到过,Spring 4对路径参数末尾的编码斜杠处理确实有坑,咱们一步步来解决:
核心原因分析
你提到中间的编码斜杠能正常工作,但末尾的不行,说明你的Servlet容器已经允许了编码斜杠的请求(比如Tomcat配置了allowEncodedSlash="true"),问题出在Spring默认的路径匹配逻辑上:
- 默认的
AntPathMatcher会自动解码URL,把%2F转成实际的/,这时候Spring会把这个/当成路径分隔符,导致参数被截断; - 同时默认开启的
trimTokens会修剪参数首尾的“空白类”字符,进一步加剧了末尾斜杠的丢失。
解决方案1:自定义全局路径匹配器配置
通过修改AntPathMatcher的核心配置,让它保留编码斜杠作为参数的一部分:
@Configuration public class WebMvcConfig extends WebMvcConfigurerAdapter { @Override public void configurePathMatch(PathMatchConfigurer configurer) { AntPathMatcher pathMatcher = new AntPathMatcher(); // 关闭参数首尾的自动修剪,确保末尾的编码字符不被移除 pathMatcher.setTrimTokens(false); // 关闭URL自动解码,让%2F以原始编码形式保留在路径参数中 pathMatcher.setUrlDecode(false); configurer.setPathMatcher(pathMatcher); } }
配置完成后,请求/dummy/ab%2F/events时,externalRequestId会被正确赋值为ab%2F,你可以在处理器方法里手动解码得到ab/:
String decodedRequestId = URLDecoder.decode(externalRequestId, StandardCharsets.UTF_8.name());
解决方案2:局部正则表达式匹配
如果不想修改全局配置,也可以直接在@RequestMapping的路径模式中,给参数指定匹配规则,强制匹配完整的编码斜杠:
@RequestMapping("/{externalSystemId}/{externalRequestId:[^/]+}/events")
这里的[^/]+表示匹配任意非斜杠的字符(%2F未解码时不属于斜杠,会被包含在内),这样就能确保末尾的%2F被完整识别为参数的一部分。
额外注意事项
- 务必确认Servlet容器允许编码斜杠:比如Tomcat需要在
server.xml的Connector标签中添加allowEncodedSlash="true",否则容器会直接拦截这类请求; - 如果你的业务逻辑需要解码后的参数值,记得手动处理解码,因为关闭自动解码后Spring会保留原始的编码字符串。
内容的提问来源于stack exchange,提问作者Graham




