spring mvc 默认启用尾随斜杠和后缀匹配,易引发安全与路由歧义;应通过webmvcconfigurer显式关闭setusetrailingslashmatch(false)和setusesuffixpatternmatch(false),并统一路径前缀加斜杠以规范路由。

Spring MVC 的路径匹配规则和尾随斜杠行为,默认会影响接口的可访问性与安全性,尤其在鉴权、路由转发或 RESTful 设计中容易引发歧义。关键在于控制两个核心开关:是否启用后缀匹配(如 /user 和 /user.json 视为同一路径),以及是否启用尾随斜杠匹配(如 /user 和 /user/ 是否等价)。
关闭尾随斜杠自动匹配
默认情况下,Spring Boot(2.x+)开启 useTrailingSlashMatch,即 /api/user 和 /api/user/ 都能命中同一个 @GetMapping("/api/user") 方法。这看似方便,但可能被用于绕过权限校验(例如鉴权规则只写了 /api/user,而攻击者用 /api/user/ 就可能漏检)。
- 推荐显式关闭:设为
false,让路径严格区分有无尾斜杠 - 通过实现
WebMvcConfigurer并重写configurePathMatch
示例代码:
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void configurePathMatch(PathMatchConfigurer configurer) {
configurer.setUseTrailingSlashMatch(false);
}
}
禁用后缀模式匹配
Spring Boot 1.x 默认允许 /user、/user.xml、/user.json 全部匹配到同一 handler;2.x 开始默认关闭该行为,但若项目遗留旧逻辑或需兼容历史调用,可能需主动调整。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 设
setUseSuffixPatternMatch(false)彻底禁用后缀匹配 - 避免因扩展名导致意外交互,提升接口语义清晰度和安全性
- 若需保留某类后缀(如仅支持
.json),应改用内容协商(produces = "application/json")而非路径匹配
路径定义中的斜杠要不要加?
在 @RequestMapping 中,类级别和方法级别的路径前加不加 /,语义不同但实际效果一致 —— Spring MVC 均按“绝对路径”处理(相对于 DispatcherServlet 的 servlet path)。不过规范建议统一加 /,原因如下:
- 避免拼接歧义:如类上写
@RequestMapping("api")、方法写@GetMapping("user"),结果是/apiuser(无斜杠时会连写) - 加斜杠明确层级:
@RequestMapping("/api")+@GetMapping("/user")→/api/user - 与前端约定一致,降低联调出错概率
自定义前缀与动态路径处理
除开关配置外,还可借助 PathMatchConfigurer 做更精细控制:
- 统一添加 API 前缀:如所有
@RestController自动前置/v1 - 注册自定义
PathMatcher(如切换为AntPathMatcher的变体或正则匹配器) - 配合拦截器做路径标准化(如强制重定向带斜杠 → 不带斜杠,或反之)
注意:yml 或 properties 文件中无法直接配置 useTrailingSlashMatch 或 useSuffixPatternMatch,必须通过 Java Config 实现。










