1. 程式人生 > >(十五)springMvc 攔截器

(十五)springMvc 攔截器

定義攔截器

springMvc 中定義攔截器只需要實現一個介面 org.springframework.web.servlet.HandlerInterceptor


public class Myfilter implements HandlerInterceptor {
  ...
}

介面中三個方法

 
   /**
      在執行 handler 之前,執行 進,進行攔截;
     方法返回 true ,則放行;返回false,則攔截 ;
     
     用途:身份認證,許可權管理
     */
    @Override
    public boolean preHandle
(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { return false; } /** 在執行handler之後,且在返回 modelAndView 之前執行 用途:為 modelAndView 填充一些統一的資料 */ @Override public void postHandle(HttpServletRequest request, HttpServletResponse response,
Object handler, ModelAndView modelAndView) throws Exception { } /** 在執行完 handler 之後(注意是執行完,不是執行),執行 ; 用途: 進行統一的異常處理 ; */ @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws
Exception { }

配置攔截器

springMvc 的攔截器是針對 HandlerMapping 的,也就是一個 攔截器,對應一個 對映器 ,哪個對映器配置了攔截器,那麼只有經過該攔截器對映成功的 handler 才會被攔截 ;;

但是,也可以配置一個 類似 於全域性的攔截器,利用 springMvc 將一個攔截器,注入到每一個 對映器 中,就可以完成類似全域性攔截器 ;

  1. 配置單個對映器的攔截器

    springMvc.xml 中進行配置 ;

    
     <!--自定義攔截器-->
        <bean class="xin.ijava.ssm.filter.Myfilter" id="myfilter" />
    
      <!--配置單個攔截器-->
        <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">
            <property name="interceptors">
                <list>
                    <ref bean="myfilter"/>
                </list>
            </property>
        </bean>
    
  2. 配置類似全域性的攔截器

    可以配置多了攔截器,類似於攔截鏈的樣子,攔截順序按照定義的順序!

        <!--配置類似全域性的攔截器-->
        <mvc:interceptors>
            <!--可以配置多個攔截器。按照配置的順序進行攔截-->
            <mvc:interceptor>
                <!--配置攔截的url , ** 代表攔截所有,包括子目錄-->
                <mvc:mapping path="/**"/>
                <bean class="xin.ijava.ssm.filter.Myfilter"/>
            </mvc:interceptor>
    
            <!--再配置一個攔截器-->
           <mvc:interceptor>
               <mvc:mapping path="/**"/>
               <bean class="xin.ijava.ssm.filter.Myfilter1"/>
           </mvc:interceptor>
        </mvc:interceptors>
    

多個攔截器的規則

這裡以 2 個攔截器為例子 ,A,B 兩個攔截器,A是第一個,B是第二個;

  1. A、B 都放行

    preHandle 按照攔截器的定義 順序執行,後兩個方法 postHandleafterCompletion ,按照攔截器的定義順序 逆序執行

  2. A放行,B不放行

    preHandle 方法總是會執行,因為在裡面進行判斷是否放行 ;

    A攔截器放行,才會執行B攔截器,加強A 沒有放行,那麼後面的攔截器都不會得到執行;

    只要有一個攔截器不放行,那麼所有的攔截器的 postHandle 都不會得到執行 ,但是其他放行的攔截器的 afterCompletion 會得到執行 ;

  3. A,B都不放行

    preHandle 方法總是會執行,因為在裡面進行判斷是否放行 ;

    由於A 沒有放行,那麼A後面的攔截器都不會得到執行了 ,就像一個鏈子一樣,在此斷掉了(攔截鏈);

綜合所述,對於統一日誌的處理,要放在第一位,並其要放行 ;