Spring MVC Matcher与RequestMapping路径匹配行为差异原因咨询
1. HandlerMapping 是否使用 HandlerMappingIntrospector 匹配URL?
HandlerMapping 本身不会依赖 HandlerMappingIntrospector 做请求URL匹配。每个 HandlerMapping 都有自己独立的路径匹配逻辑,比如 RequestMappingHandlerMapping 会通过 RequestMappingInfo 来匹配请求路径、请求方法等条件。
HandlerMappingIntrospector 只是一个工具类,作用是内省系统中所有 HandlerMapping 的配置信息——比如提取所有已映射的路径、判断某个请求是否属于Spring MVC的处理范围等,主要是给Spring Security这类需要复用MVC路径规则的组件提供支持,并非HandlerMapping自身匹配请求的核心依赖。
2. 为什么 @RequestMapping 和 mvcMatchers 路径逻辑不一致?
核心原因是两者对输入路径的规范化处理规则完全不同:
@RequestMapping 的路径处理:Spring MVC在解析
@RequestMapping注解的路径时,会自动做路径规范化:- 如果路径不以
/开头,会自动在前面补/; - 如果是方法级的
@RequestMapping,还会自动和类级的@RequestMapping路径拼接成完整路径。
所以你写@RequestMapping("contact"),最终会被处理成/contact(类上无@RequestMapping时),能匹配浏览器发来的/contact请求。
- 如果路径不以
mvcMatchers 的路径处理:Spring Security的
mvcMatchers虽然依赖HandlerMappingIntrospector复用MVC的路径匹配规则,但它不会自动给输入的路径补/。浏览器发送的请求URL必然是以/开头的(比如/contact),而你写mvcMatchers("contact")时,它会尝试匹配路径为contact的请求,自然匹配不上。只有当你写mvcMatchers("/contact")时,才会和实际请求路径匹配,从而生效。
简单总结:@RequestMapping是"声明接口路径",框架会帮你自动修正格式;mvcMatchers是"匹配实际请求路径",要求你输入的路径和浏览器发来的路径格式完全一致。
内容的提问来源于stack exchange,提问作者munknown

