#尾部加”/”匹配useTrailingSlashMatch ##參數初始化 參數初始化取決於requestMapping這個bean,這個bean在spring的IOC容器中初始化 我們重載一下requestMapping這個類即可 而在springboot中的初始化的bean名稱預設是reque ...
尾部加”/”匹配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去繞過校驗,這個時候我們吧這個配置關掉就可以避免這種情況