You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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.xmlConnector标签中添加allowEncodedSlash="true",否则容器会直接拦截这类请求;
  • 如果你的业务逻辑需要解码后的参数值,记得手动处理解码,因为关闭自动解码后Spring会保留原始的编码字符串。

内容的提问来源于stack exchange,提问作者Graham

火山引擎 最新活动