springmvc註解開發-高級之 攔截器

1      攔截器

1.1      攔截定義

 

定義攔截器,實現HandlerInterceptor接口。接口中提供三個方法。

 

public classHandlerInterceptor1implementsHandlerInterceptor {

 

  

   //進入 Handler方法之前執行

   //用於身份認證、身份授權

   //比如身份認證,如果認證通過表示當前用戶沒有登陸,需要此方法攔截不再向下執行

   @Override

   public booleanpreHandle(HttpServletRequest request,

         HttpServletResponseresponse, Object handler) throws Exception {

     

      //return false表示攔截,不向下執行

      //return true表示放行

      return false;

   }

 

   //進入Handler方法之後,返回modelAndView之前執行

   //應用場景從modelAndView出發:將公用的模型數據(比如菜單導航)在這裏傳到視圖,也可以在這裏統一指定視圖

   @Override

   public voidpostHandle(HttpServletRequest request,

         HttpServletResponseresponse, Object handler,

         ModelAndViewmodelAndView) throwsException {

     

     

   }

 

   //執行Handler完成執行此方法

   //應用場景:統一異常處理,統一日誌處理

   @Override

   public voidafterCompletion(HttpServletRequest request,

         HttpServletResponseresponse, Object handler, Exception ex)

         throws Exception {

     

     

   }

 

}

1.2      攔截器配置

 

 

1.2.1    針對HandlerMapping配置

springmvc攔截器針對HandlerMapping進行攔截設置,如果在某個HandlerMapping中配置攔截,經過該HandlerMapping映射成功的handler最終使用該攔截器。

<bean

    class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">

    <property name="interceptors">

       <list>

           <ref bean="handlerInterceptor1"/>

           <ref bean="handlerInterceptor2"/>

       </list>

    </property>

</bean>

    <bean id="handlerInterceptor1"class="springmvc.intercapter.HandlerInterceptor1"/>

    <bean id="handlerInterceptor2"class="springmvc.intercapter.HandlerInterceptor2"/>

一般不推薦使用。

 

1.2.2    類似全局的攔截器

springmvc配置類似全局的攔截器,springmvc框架將配置的類似全局的攔截器注入到每個HandlerMapping中。

 

 

 

1.3      攔截測試

1.3.1    測試需求

測試多個攔截器各各方法執行時機。

 

 

1.3.2    編寫兩個攔截

 

1.3.3    兩個攔截器都放行

 

HandlerInterceptor1...preHandle

HandlerInterceptor2...preHandle

 

HandlerInterceptor2...postHandle

HandlerInterceptor1...postHandle

 

HandlerInterceptor2...afterCompletion

HandlerInterceptor1...afterCompletion

 

總結:

preHandle方法按順序執行,

postHandle和afterCompletion按攔截器配置的逆向順序執行。

 

1.3.4     攔截器1放行,攔截器2不放行

HandlerInterceptor1...preHandle

HandlerInterceptor2...preHandle

HandlerInterceptor1...afterCompletion

 

總結:

攔截器1放行,攔截器2 preHandle纔會執行。

攔截器2 preHandle不放行,攔截器2 postHandle和afterCompletion不會執行。

只要有一個攔截器不放行,postHandle不會執行。

 

1.3.1    攔截器1不放行,攔截器2不放行

HandlerInterceptor1...preHandle

 

攔截器1 preHandle不放行,postHandle和afterCompletion不會執行。

攔截器1 preHandle不放行,攔截器2不執行。

 

 

1.3.2    小結

 

根據測試結果,對攔截器應用。

 

比如:統一日誌處理攔截器,需要該攔截器preHandle一定要放行,且將它放在攔截器鏈接中第一個位置。

 

比如:登陸認證攔截器,放在攔截器鏈接中第一個位置。權限校驗攔截器,放在登陸認證攔截器之後。(因爲登陸通過後才校驗權限)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章