default-servlet-handler不生效原因,springmvc靜態資源攔截方案比較

springmvc爲什麼要攔截靜態資源?


簡單來說,爲了請求的url不帶類似*.action,*.do,比如http://localhost:8080/system/index.action,spring團隊統一風格,而web項目配置的web.xml中,所有請求都必須走過DispatcherServlet,當然就包括了靜態資源,比如http://localhost:8080/html/index.html,爲了解決這個問題,spring給了兩種方案,下面我們一起來討論下兩種方案的使用和區別,給新手同學們一個很自白,清晰的認識!


解決辦法


說解決辦法之前,咱先來聊下web項目的結構,如下圖所示,大家可以看到默認webapp下有個WEB-INF文件夾,這個文件夾是提升文件安全級別的,如果不設置,是訪問不到的,所以大家一般看到的資源文件(jsp,css,jss)都在WEB-INF文件夾下。

image.png

解決辦法1:

<mvc:default-servlet-handler />

如果項目是這樣配置的,你訪問不到WEB-INF/css/下的文件,因爲springmvc上下文定義了一個DefaultServletHttpRequestHandler用於處理靜態文件的,他做的工作是轉發給Spring默認處理器DispatcherServlet,DispatcherServlet能處理webapp下沒有權限目錄文件,它不能處理WEB-INF文件夾,也就是說你配置了<mvc:default-servlet-handler />,你能夠訪問html下的文件,但是你訪問不了WEB-INF/css/下的文件,這可能是文件夾權限原因,根據官方文檔說明,這樣配置可以與解決方法2共存。下面我們來看看方法2。

解決辦法2:

<mvc:resources mapping="/css/**" location="WEB-INF/css/" />

location:對應是根路徑

mapping:映射是訪問路徑

通過http://localhost:8080/css/index.css就可以訪問到被攔截的資源了。這種方式能解決方法1的侷限情況。


總結


做個總結吧,我推薦這種方式2來解決訪問靜態資源攔截問題,我覺得方法1可以不寫,就按方法2做配置,夠用了。方法2可能配置的多一些,但是看起來比較清晰,更容易理解。謝謝童鞋們的觀看,如果喜歡或有疑惑,請點贊和留言哦!我是叫練,邊叫邊練。



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