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一定要放行,且將它放在攔截器鏈接中第一個位置。
比如:登陸認證攔截器,放在攔截器鏈接中第一個位置。權限校驗攔截器,放在登陸認證攔截器之後。(因爲登陸通過後才校驗權限)