首頁 > 科技

SpringBoot訪問工程目錄下的靜態資源,你真的懂嗎?

2021-06-24 17:19:46

1、牛刀小試

1.1 圖片靜態資源的訪問

先看官方怎麼說,點選連結,開啟 SpringBoot官方文件

文件中明確指出:/static (or /public or /resources or /META-INF/resources) ,這幾個目錄是SpringBoot放置靜態資源的目錄,只要把靜態資源放到這幾個目錄下,就能直接訪問到。

新建 Spingboot web項目試下,新項目只有 /static 目錄 ,手動創建其他幾個靜態資原始檔夾,每個目錄新增1張圖片

啟動項目,分別訪問這四張圖片:

發現圖片均可訪問,文件說的對,果然沒騙人,由此我們認定 SpringBoot 訪問靜態資源 :當前項目根路徑 + / + 靜態資源名。

1.2 為靜態資源新增訪問字首

文件又解釋了一下,說,預設情況下SpringBoot是幫你對映的路徑是 /** ,

但是,如果你想加一個字首也可以,比如 /res/

技術圈有句話:先有業務才有技術,SpringBoot官方考慮到某些網站添加了登入驗證,一般需要登入後才能訪問項目中的資源,為了登入頁樣式也能正常顯示,方便放行靜態資源,直接給所有靜態資源新增一個字首,既可統一攔截,又可統一放開

操作:在配置檔案application.properties中新增

1.3 WelCome Page 的奇妙跳轉

文件說把一個名稱叫 index.html 的檔案放到任意的靜態目錄下,訪問http://localhost:8080 即可到達,意思就是給你一個首頁跳轉的快捷方式(注意:需把1.2 的配置路徑去掉,否則會導致welcome page功能失效,後面源碼分析會說到)新建html,放到 /static 下,訪問:

2、那麼,SpringBoot是如何做到的呢?

接下來看源碼探究 SpringBoot 靜態資源配置原理 》》》》 gogogo

源碼位置在:spring-boot-autoconfigure-2.5.1.jar 這個jar裡面,具體的目錄如下:

WebMvcAutoConfiguration類裡面找到 addResourceHandlers 方法,顧名思義 新增資源處理器

第一個if判斷 this.resourceProperties.isAddMappings() 去配置檔案獲取

spring.resources 這個屬性,預設是 true , 如果設定為false 那麼就等於禁用掉所有的靜態資源對映功能,不行就試一下

改回 true ,首頁就又可以訪問了

不要停留,繼續看第二個 addResourceHandler 方法,打斷點看看這個方法添加了什麼規則

沒錯,第二個addResourceHandler 方法就表明 / ** 下的所有請求,都在這四個預設的位置去找靜態資源對映,這四個目錄在官方文件中提到過。

另外,訪問路徑字首是在 this.mvcProperties.getStaticPathPattern()獲取的,配置上:

spring.mvc.static-path-pattern=/res/**

打斷點如下:

注意: 所有的請求先去controller控制器找對映,找不到,再來靜態資源對映器。

到這裡解決了靜態資源目錄的問題。

還是在 WebMvcAutoConfiguration 這個類:搜尋 「WelcomePage」 :

把 WelcomePageHandlerMapping 的有參構造也拿來

根據有參構造可以看出來,只有 歡迎頁這個資源存在,並且 靜態資源訪問路徑是 /** ,才能重定向到indes.html ,否則就會去找 Controller 處理。

這就解釋了,上面為什麼配置了靜態資源訪問路徑 為/res/** 後導致首頁無法訪問到 的問題

好了,前面牛刀小試的坑已經填完了,關於SpringBoot 靜態資源配置原理 這篇總結就到這了

如何獲取Java學習資料?

轉發分享此文,後臺私信小編:「 資料 」即可獲取。注意是私信,因為檔案比較大,所以要加好友,免費,不花錢(注:轉發分享,感謝大家)


IT145.com E-mail:sddin#qq.com