1. 程式人生 > >springmvc 攔截器攔截靜態資源

springmvc 攔截器攔截靜態資源

springmvc攔截器interceptors

  springmvc攔截器能夠對請求的資源路徑進行攔截,極大的簡化了攔截器的書寫。但是,千萬千萬要注意一點:靜態資源的放行。

 上程式碼:

<mvc:resources mapping="/resources/**" location="/static/resources" />
<mvc:resources mapping="/static/css/**" location="/static/css/" />
<mvc:resources mapping="/static/images/**" location="/static/images/" />
<mvc:resources mapping="/static/js/**" location="/static/js/" />
<mvc:interceptors>
	<!-- 使用bean定義一個Interceptor,直接定義在mvc:interceptors根下面的Interceptor將攔截所有的請求 
	<bean class="com.myTree.interceptor.LoginInterceptor" />-->
	<mvc:interceptor>
		 <mvc:mapping path="/**" />
		 <!-- 需排除攔截的地址 -->  
         <mvc:exclude-mapping path="/Login"/>  
         <mvc:exclude-mapping path="/login"/>  
         <mvc:exclude-mapping path="/sattic/**"/>  
		 <!-- 定義在mvc:interceptor下面的表示是對特定的請求才進行攔截的 -->
		 <beans:bean class="com.myTree.interceptor.LoginInterceptor" />
	</mvc:interceptor>
</mvc:interceptors>

問題來了,在請求jsp頁面的時候,你的靜態資源的訪問仍然會被自定義攔截器攔截,這會導致程式執行的效率大大下降,還會不停的跳轉到攔截器的邏輯。主要原因是

<mvc:mapping path="/**" />

會對所有的請求資源進行攔截,雖然靜態資源已經排除了,但還是會被攔截到。

如何解決這個bug呢?

主要有三種方式:

1、修改請求的url地址。

 如果請求的url地址都是以*.do結尾,那麼攔截器中的配置可以變為攔截以do結尾的資源,靜態資源自然就不會被攔截到了;

2、在自定義攔截器中對資源進行判斷,如果滿足需要排除的資源,就進行放行。

<!-- 攔截器配置 -->  
    <mvc:interceptors>  
      <!-- session超時 -->  
      <mvc:interceptor>  
        <mvc:mapping path="/*/*"/>  
        <bean class="com.myTree.interceptor.LoginInterceptor">
          <property name="allowUrls">  
            <list>  
              <!-- 如果請求中包含以下路徑,則不進行攔截 -->  
              <value>/login</value>  
              <value>/js</value>  
              <value>/css</value>  
              <value>/image</value>  
              <value>/images</value>  
            </list>  
          </property>  
        </bean>  
      </mvc:interceptor>  
    </mvc:interceptors>  
/** 
 * 處理登入攔截器 
 */  
public class LoginInterceptor  implements HandlerInterceptor{  
      
    public String[] allowUrls;//還沒發現可以直接配置不攔截的資源,所以在程式碼裡面來排除  
      
    public void setAllowUrls(String[] allowUrls) {  
        this.allowUrls = allowUrls;  
    }  
  
    @Override  
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    String requestUrl = request.getRequestURI().replace(request.getContextPath(), "");    
        System.out.println(requestUrl);  
        if(null != allowUrls && allowUrls.length>=1){  
            for(String url : allowUrls) {    
                if(requestUrl.contains(url)) {    
                    return true;    
                }    
            }
    }
}

3、設定web.xml中的預設攔截器,不攔截靜態資源

  在springmvc的Dispatcher中配置<mvc:default-servlet-handler />(一般Web應用伺服器預設的Servlet名稱是"default",所以這裡我們啟用Tomcat的defaultServlet來處理靜態檔案,在web.xml裡配置如下程式碼即可:)

<!-- 該servlet為tomcat,jetty等容器提供,將靜態資源對映從/改為/static/目錄,如原來訪問 http://localhost/foo.css ,現在http://localhost/static/foo.css -->  
<!-- 不攔截靜態檔案 -->  
<servlet-mapping>  
    <servlet-name>default</servlet-name>  
    <url-pattern>/js/*</url-pattern>  
    <url-pattern>/css/*</url-pattern>  
    <url-pattern>/images/*</url-pattern>  
    <url-pattern>/fonts/*</url-pattern>  
</servlet-mapping>