springboot之靜態資源路徑間的較量

HTML 文章 Docker 科技 小裁縫先生 小裁縫先生 2017-08-26

springboot之靜態資源路徑間的較量

在上一篇文章Springboot遇上thymeleaf中,我們提到了springboot的靜態文件存放的位置static目錄,其實在springboot的官方文檔中對於默認靜態的文件的存放位置有明確的說明。如下:

By default Spring Boot will serve static content from a directory called /static (or /public or /resources or /META-INF/resources) in the classpath or from the root of the ServletContext

翻譯後的意思就是說默認情況下,Spring Boot將在類路徑中或從ServletContext的根目錄中提供名為/ static(或/ public或/ resources或/ META-INF / resources)的目錄中的靜態內容。也就是說默認情況下,可以將靜態文件放到staticpublicresources/ META-INF / resources四個目錄下。

如果一個文件可以放在四個路徑下,那肯定會有個先後之分,因此我做了一個十分簡單的驗證。驗證方法就是首先在四個路徑中放入相同名字的html文件,然後通過瀏覽器訪問,在確認了優先級最高的那個之後,在其他的路徑中寫入另外一個相同文件名的html,再通過瀏覽器訪問,判斷出剩下的路徑的優先級,以此類推在,直到將四個排序完成。代碼結構如下:

springboot之靜態資源路徑間的較量

在經過驗證之後,得出的結論為META-INF/resources > resources > static > public


在實際開發過程中,springboot是打成jar進行部署或者打成docker鏡像啟動容器來進行使用的。在這種情況下,如果涉及到圖片上傳或者系統就是一個CMS系統(內容管理系統),在圖片上傳時就相當於是上傳到了.jar文件中去,這樣效率會非常低。而且如果用戶上傳的圖片都放到工程下面,這個工程就會變得越來越大,這樣做備份的時候就會麻煩。因此,就需要將存放用戶上傳圖片(靜態文件)的路徑映射到本地磁盤的路徑,即需要自定義靜態資源路徑,而springboot也提供了這樣的方法。

springboot提供了兩種自定義靜態資源路徑的方法:

  • 第一種為繼承WebMvcConfigurerAdapter類並重寫addResourceHandlers 方法

springboot之靜態資源路徑間的較量

在修改完成之後,我們在D:\topline中放入一個topline.html。啟動服務器,通過瀏覽器訪問ip:port/topline.html,我們可以看到如下內容:

springboot之靜態資源路徑間的較量

這說明,上圖中的解決方案是可行的。但是,我嘗試著訪問之前做優先級測試的地址,則發現出現了404錯誤,

springboot之靜態資源路徑間的較量

這應該是Springboot默認的路徑失效了,經過查看官方文檔才知道,原來Springboot的默認的靜態資源路徑匹配的正則表達式為"/**",而我們剛剛設置的也是"/**",這樣就將默認的給覆蓋了。對於這樣的問題,有兩種解決方案。

第一種就是修改自定義靜態資源訪問路徑的正則表達式:

springboot之靜態資源路徑間的較量

修改之後,訪問靜態資源的路徑也需要相應的修改

springboot之靜態資源路徑間的較量

第二種就是將默認的正則表達式對應的地址加上,

springboot之靜態資源路徑間的較量

上圖中第一處跟第二處的效果一樣,修改完成後,我們在查看頁面,

springboot之靜態資源路徑間的較量

接著,我們再做一次驗證。我們在D盤的topline中加入一個名為test.html的文件,再次訪問看看是什麼情況

springboot之靜態資源路徑間的較量

可以看到顯示的test.html變為了D盤下的,經過多次驗證得到的結論是addResourceLocations方法中前面加入的路徑的優先級要高於後面路徑。


  • 第二種配置方法為通過配置文件,static-location的順序影響優先級別

springboot之靜態資源路徑間的較量

上面主要講了自定義靜態資源路徑到磁盤路徑,其實自定義到classpath下也非常的簡單,只需要把file:D:/topline/換成classpath:topline,這樣項目中topline就可以用來存放靜態資源(不過話說話來,Springboot中已經提供了四個目錄了,再加一個意義也不是很大)。

到這裡這篇文章就算是結束了,文章中主要涉及到下面幾點:

  1. Springboot提供的放置靜態資源的目錄有四個,他們的優先級為META-INF/resources > resources > static > public

  2. 可以通過繼承WebMvcConfigurerAdapter類或者配置application.yml(application)來自定義靜態資源路徑

  3. 同時也可以通過WebMvcConfigurerAdapter或者配置文件來修改默認的優先級

大家有什麼意見或者想法,歡迎評論

相關推薦

推薦中...