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文件夾下。
解決辦法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可能配置的多一些,但是看起來比較清晰,更容易理解。謝謝童鞋們的觀看,如果喜歡或有疑惑,請點贊和留言哦!我是叫練,邊叫邊練。