26、Springmvc中的requestMapping是如何匹配的-
尾部加”/”匹配useTrailingSlashMatch
参数初始化
参数初始化取决于requestMapping这个bean,这个bean在spring的IOC容器中初始化
我们重载一下requestMapping这个类即可
而在springboot中的初始化的bean名称默认是requestMappingHandlerMapping
而使得这个bean注入的类是WebMvcAutoConfiguration
org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration.EnableWebMvcConfiguration#requestMappingHandlerMapping
也是WebMvcConfigurationSupport 这个类,也就是说在初始化这个类的时候会注入mapping的对象
通过观察源码,EnableWebMvcConfiguration初始化最终还是在WebMvcConfigurationSupport中进行初始化mapping对象
通过继承我们发现support才是真正的注入方法类
这个创建bean的方法中有这样一段代码
打开进去看看
到这里我们发现这个对象的初始化是new出来,也就是说无法配置,都是默认设置的值,但是同时我们注意到下面有个config方法,我们进去看看
看一下是哪里调用了configurePathMatch方法
我们发现是这个类调用了,然后循环处理配置,我们看一下这个代理的配置从哪来的
继续探讨
最终我们观察到注入进来的类是
org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration.WebMvcAutoConfigurationAdapter,继续追踪
这个地方就是这种path匹配规则的地方,但是在这个类中,没有设置我们想要修改的值
Mvc默认在yml文件中的配置也不支持
那么就只能自己重载一下
直接重载这里会有个问题,因为ResourceHandlerRegistrationCustomizer不是spring对外公开的类,那么这里直接使用就会报错
我们需要实现这类
至此大工告成,运行起来看看
下面是false的原因是我修改yml文件配置
匹配规则
- Controller中的匹配规则不是/结尾的
- 请求的路径是Controller中路径+/的组合
如果匹配成功,返回匹配成功的结果
验证结果
修改配置
路径匹配失败
总结
研究这个问题的主要原因是,springmvc会默认吧这个斜杠匹配到不带斜杠的路径上,这样就可能对我们的路径匹配有困扰
如果我们是用springmvc的pattern进行匹配鉴权的url,那么就可以通过构建一个斜杠的url去绕过校验,这个时候我们吧这个配置关掉就可以避免这种情况