springMVC中/*与/**匹配的区别
在 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 ✔
- 代码示例
@Configuration
public class WebConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {// 只拦截 /user/ 下一级registry.addInterceptor(new UserInterceptor()).addPathPatterns("/user/*");// 拦截 /user 及其所有子路径// registry.addInterceptor(new UserInterceptor())// .addPathPatterns("/user/**");}
}
- 容易踩的坑
/user/*
不会匹配到/user
本身(因为*
至少要有一段字符)。
如果你想把/user
也一起拦截,需要再加一条/user
或者改用/user/**
。- 如果用了
/**
又只想排除某些子路径,记得再配合excludePathPatterns("...")
使用。
结论
记住一句话:
“单星只走一层,双星层层通吃”。
根据业务需要选择即可。