SpringMVC之靜態資源訪問
web.xml中的DispatcherServlet對應的<url-pattern>/</url-pattern>攔截了所有請求,靜態資源也無法訪問。
有的靜態資源是需要限制訪問的,但有的靜態資源(如:css樣式檔案和js檔案、頁面用到的圖片)我們是不希望進行攔截的。
SpringMVC訪問靜態資源有三種方式。
方案一:啟用Tomcat的defaultServlet來處理靜態檔案
<servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.jpg</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.js</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.css</url-pattern> </servlet-mapping>
每種不需要過濾檔案的字尾都需要設定一個。要寫在DispatcherServlet的前面, 讓defaultServlet先攔截,這個就不會進入Spring
下面的兩種方式都是在springmvc的配置檔案中,檔案的springmvc檔案該怎麼配置就不多說了。
且兩者都引用了mvc註解,那麼需要在使用它們之前加上註解支援:
<mvc:annotation-driven />
方案二,使用<mvc:default-servlet-handler/>
直接在SpringMVC配置檔案中加上以下內容即可。
<mvc:default-servlet-handler/>
方案三: 在spring3.0.4以後版本提供了mvc:resources
按網上搜的所有方法配置,我的css檔案全放在WebContent/static/css下
<mvc:resources location="/static/css/" mapping="/css/**" />
然而依照網上的配置都不靠譜呀。
控制檯出現警示:No mapping found for HTTP request with URI [/springmvcoa/static/css/ack.css] in DispatcherServlet with name 'dispatcherServlet'
頁面樣式無法載入。
根據控制檯警告知道就是這個資源配置路徑的問題。
於是直接訪問樣式檔案,頁面404報錯,控制檯出現上面的警告。
既然是路徑的問題,我就一步步測試。
新建兩個a.txt,路徑分別為static/css和static/css/css
http://localhost/springmvcoa/static/css/a.txt按上面的方式,警示內容:WARN PageNotFound:1147 - No mapping found for HTTP request with URI [/springmvcoa/static/css/a.txt] in DispatcherServlet with name 'dispatcherServlet'
不停除錯location和resource後,mvc:resource配置為:
<mvc:resources location="/static/css/" mapping="/static/css/**" />
和
<mvc:resources location="/static/css/" mapping="static/css/**" />
均可。
如果要配置多個資料夾就設定多個mvc:resource。
如果是訪問static下所有目錄,包括css、js、image等檔案的目錄,則配置:
<mvc:resources location="/static/" mapping="/static/**" />
這些方式配置的檔案都是可直接訪問
當加了攔截器,發現配置好可以直接訪問的靜態資源的路徑也會被攔截,
<!-- 攔截器配置 -->
<mvc:interceptors>
<!-- 登入驗證和session控制 -->
<mvc:interceptor>
<!-- 攔截所有路徑 -->
<mvc:mapping path="/**"/>
<!-- 不過攔截器的請求 -->
<mvc:exclude-mapping path="/static/**"/>
<mvc:exclude-mapping path="/user/login"/>
<bean class="com.ack.crm.interceptor.LoginInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
這樣static以及static子目錄中的檔案路徑不會被攔截;登入操作也要配置為不攔截,不然沒法進行登入;後期還有退出登入等操作需要不攔截。
SpringMVC可以過濾所有路徑,免去了需要配置過濾器;