【sping揭秘】26、Springmvc中的requestMapping是如何匹配的------url尾部加/

尾部加”/”匹配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文件配置

匹配规则

  1. Controller中的匹配规则不是/结尾的
  2. 请求的路径是Controller中路径+/的组合

如果匹配成功,返回匹配成功的结果

验证结果

修改配置

路径匹配失败

总结

研究这个问题的主要原因是,springmvc会默认吧这个斜杠匹配到不带斜杠的路径上,这样就可能对我们的路径匹配有困扰
如果我们是用springmvc的pattern进行匹配鉴权的url,那么就可以通过构建一个斜杠的url去绕过校验,这个时候我们吧这个配置关掉就可以避免这种情况

posted @ 2022-04-18 22:02  cutter_point  阅读(808)  评论(0编辑  收藏  举报