在 Spring MVC 中,这两个模式只差了一颗星,但匹配的"深度"完全不同。
一句话:
/user/*只能匹配一级,即/user/abc、/user/123都 OK,但/user/abc/profile就不行。/user/**可以匹配无限多级,即/user及其下面任意层级的路径都 OK,例如/user、/user/abc、/user/abc/profile、/user/a/b/c/d等。
下面把规则展开说清,并给出代码示例,方便你一眼看出区别。
- Ant 风格路径通配符规则(Spring 用到)
?匹配任意单个字符*匹配任意一段 字符(不能跨/)**匹配任意多段 字符(可以跨/,必须是整个路径段)
- 对应关系
模式 能否匹配 举例
/user/* 只能匹配 /user/ 下一级 /user/123 ✔
/user/123/info ✘
/user/** 可匹配 /user 及其下任意层级 /user ✔
/user/123 ✔
/user/123/info ✔
/user/a/b/c/d ✔
- 代码示例
java
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 只拦截 /user/ 下一级
registry.addInterceptor(new UserInterceptor())
.addPathPatterns("/user/*");
// 拦截 /user 及其所有子路径
// registry.addInterceptor(new UserInterceptor())
// .addPathPatterns("/user/**");
}
}
- 容易踩的坑
/user/*不会匹配到/user本身(因为*至少要有一段字符)。
如果你想把/user也一起拦截,需要再加一条/user或者改用/user/**。- 如果用了
/**又只想排除某些子路径,记得再配合excludePathPatterns("...")使用。
结论
记住一句话:
"单星只走一层,双星层层通吃"。
根据业务需要选择即可。