天天看點

SpringMVC中處理靜态資源的幾種方式

【1】設定預設Servlet

即将DispatcherServlet請求映射設定為 ​

​/​

​ ,将會攔截所有的請求。注意哦,有可能不能通路靜态資源。

<servlet>
    <servlet-name>spring</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring-servlet.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>spring</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>      

① ​

​<mvc:default-servlet-handler/>​

通常在SpringMVC的配置檔案中配置如下标簽配套使用(解決靜态資源不能通路問題)

<mvc:default-servlet-handler/>      

其XSD文檔說明如下:

SpringMVC中處理靜态資源的幾種方式

解釋如下:

​<mvc:default-servlet-handler/>​

​​将在SpringMVC的上下文中定義一個​

​DefaultServletHttpRequestHandler​

​來處理靜态資源(其實就是将請求轉發給預設的servlet)。

配置一個handler通過轉發請求到Servlet 容器的預設servlet來處理靜态資源。使用該handler将會允許​

​DispatcherServlet​

​​ 的​

​url-pattern​

​​為​

​'/'​

​​;同時使用Servlet 容器的預設servlet處理靜态資源。該handler将會轉發所有請求到預設servlet。是以将該handler的執行順序放到所有請求處理的最後是非常重要的。如果您使用“​

​annotation driven​

​​”标簽,或者設定自定義​

​HandlerMapping​

​​執行個體,則會出現這種情況。請確定将其“order”屬性設定為低于​

​DefaultServletHttpRequestHandler​

​​的值,即​

​Integer.MAX_VALUE​

​。

一般WEB伺服器預設的​

​servlet​

​​的名稱為​

​default​

​​。若所使用的WEB伺服器預設的Servlet名稱不是default,則需要通過​

​default-servlet-name​

​ 屬性指定!

SpringMVC中處理靜态資源的幾種方式

不同伺服器下預設servlet名字

Tomcat, Jetty, JBoss, and GlassFish  預設 Servlet的名字 -- "default"
Google App Engine 預設 Servlet的名字 -- "_ah_default"
Resin 預設 Servlet的名字 -- "resin-file"
WebLogic 預設 Servlet的名字  -- "FileServlet"
WebSphere  預設 Servlet的名字 -- "SimpleFileServlet"      
SpringMVC中處理靜态資源的幾種方式

② Controller跳轉失效

使用上述配置,你會發現正常的Controller跳轉失效了!

XSD說明最後一段話說明,要麼配置​

​<mvc:annotation-driven />​

​标簽,要麼手動注冊請求映射處理bean于xml中,并設定order屬性值小于DefaultServletHttpRequestHandler的order屬性值!

常用的解決方式為配置​

​<mvc:annotation-driven />​

​​标簽,詳情點選檢視請求映射失效。

【2】url-pattern設定為*.do

解決靜态資源的思路是,在SpringMVC.xml中,攔截設定為​

​"*.do"​

​​,而不是​

​"/"​

​。這樣就不會攔截靜态資源的請求。

需要注意的是,如果項目中用到了shiro或者其他權限架構。那麼需要注意你的shiro.xml配置,示例如下:

<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
     <!-- Shiro的核心安全接口,這個屬性是必須的 -->
     <property name="securityManager" ref="securityManager"/>
     <!-- loginUrl認證送出位址,如果沒有認證将會請求此位址進行認證,請求此位址将由formAuthenticationFilter進行表單認證 -->
     <property name="loginUrl" value="/login"/>

     <!-- Shiro連接配接限制配置,即過濾鍊的定義 -->
     <property name="filterChainDefinitions">
         <value>
             <!-- /** = anon所有url都可以匿名通路 -->
             <!-- 對靜态資源設定匿名通路 -->
             /images/** = anon
             /js/** = anon
             /styles/** = anon
             <!-- 驗證碼,可匿名通路 -->
             /validateCode = anon  <!--驗證碼-->
             /doLogin = anon

             <!-- /** = authc 所有url都必須認證通過才可以通路 -->
             /**=authc
             <!--請求logout,shrio擦除sssion-->
             /logout=logout
         </value>
     </property>
 </bean>      

需要注意的是雖然SpringMVC攔截的是​

​.do​

​,但是由于使用了shiro(或者你的其他權限架構),那麼未登入情況下是不能直接通路除shiro配置檔案裡面允許匿名通路的路徑之外的靜态資源檔案。

舉個例子,你把靜态資源檔案放在了項目根目錄,但是參考上面配置檔案,顯然不在匿名通路路徑清單之内,是以會提示你先登入,登入之後才可通路項目根目錄的靜态資源檔案。

未登入前通路項目根目錄下1.jpg , 跳到登入頁面:

SpringMVC中處理靜态資源的幾種方式

登入後通路項目根目錄下1.jpg :

SpringMVC中處理靜态資源的幾種方式

另外,建議最好參考shiro配置檔案,比如1.jpg放到images檔案夾下,那麼不用登入就可以直接通路。

SpringMVC中處理靜态資源的幾種方式

【3】​​​​

通過配置,避免靜态資源被攔截

<!-- 靜态資源通路(不攔截此目錄下的東西的通路) -->
<mvc:resources location="/js/" mapping="/js/**"/>
<mvc:resources location="/css/" mapping="/css/**"/>
<mvc:resources location="/images/" mapping="/images/**"/>
<mvc:resources location="/bootstrap/" mapping="/bootstrap/**"/>      

該标簽的xsd說明文檔如下:

  • 配置一個處理程式,用于為靜态資源(如圖像、js和css檔案)提供服務,并使用優化的緩存頭在web浏覽器中高效加載。
  • 允許在通過Spring的資源處理可以通路的任何路徑之外提供資源。

注冊的handler如下:

org.springframework.web.servlet.resource.ResourceHttpRequestHandler      

即,該标簽注冊ResourceHttpRequestHandler為靜态資源的通路提供服務。

【4】

确切說這裡隻解決不通過controller而直接通路jsp的問題。

​<mvc:view-controller/>​

​直接通路view-name對應的jsp

<!-- mvc:view-controller可使其直接通路路徑 -->  
<mvc:view-controller path="/i18n" view-name="i18n"/>

<mvc:view-controller path="/i18n2" view-name="i18n2"/>      

【5】在web.xml中作手動配置default servlet映射

<servlet-mapping>
   <servlet-name>default</servlet-name>
   <url-pattern>*.css</url-pattern>
</servlet-mapping>
<servlet-mapping>
   <servlet-name>default</servlet-name>
   <url-pattern>*.gif</url-pattern>
</servlet-mapping>
<servlet-mapping>
   <servlet-name>default</servlet-name>
   <url-pattern>*.mp4</url-pattern>
</servlet-mapping>
<servlet-mapping>
   <servlet-name>default</servlet-name>
   <url-pattern>*.png</url-pattern>
</servlet-mapping>
<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>*.html</url-pattern>
</servlet-mapping>      

繼續閱讀