【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去繞過校驗,這個時候我們吧這個配置關掉就可以避免這種情況

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章