1. 程式人生 > >SpringMVC之靜態資源訪問

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可以過濾所有路徑,免去了需要配置過濾器;