springmvc攔截器
攔截器的作用
springmvc提供攔截器實現對Handler進行面向切面編程,可以Handler執行之前、之後、之中添加代碼,這種方式就是切面編程。
攔截器相當 於一個過慮器,可以預處理、後處理等。
- 使用攔截器實現:
1、在Handler執行之前攔截校驗用戶權限,如果用戶沒有操作權限就不能繼續執行Handler.
2、Handler執行完成後統一在攔截器中記錄操作日誌。
springmvc攔截器定義
springmvc提供HanlderInterceptor接口,實現該接口的就是攔截器。
public class HandlerInterceptor1 implements HandlerInterceptor {
//執行時機:Handler執行之前去執行
//使用場景:用於用戶權限攔截校驗
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
//返回 true表示不攔截即放行
//返回false表示攔截,不再向後執行
return false;
}
//執行時機:Handler執行未返回modelAndView之前 去執行
//使用場景 :將頁面需要通用的信息通過modelAndView傳到頁面,比如:菜單 導航通用在此方法取出來傳到頁面
//比如:統一定義視圖決定視圖轉向
@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
}
//執行時機:Handler執行完成並且 將modelAndView返回
//使用場景 :統一進行異常處理,統一記錄操作日誌。。。
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)
throws Exception {
}
}
攔截器配置
- 重點!!!springmvc的攔截器針對HandlerMapping處理器映射器配置的。
針對所有mapping配置全局攔截器:
springmvc中沒有全局攔截器概念,使用這種配置,springmvc將配置的攔截器分別注入到多個處理器映射器。
<!-- springmvc攔截器 -->
<mvc:interceptors>
<!--多個攔截器,順序執行 -->
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="com.bsw.mybatis.interceptor.HandlerInteceptor1"></bean>
</mvc:interceptor>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="com.bsw.mybatis.interceptor.HandlerInteceptor2"></bean>
</mvc:interceptor>
</mvc:interceptors>
實現對攔截器執行順序及流程的測試
- 全都放行
HandlerInterceptor1…preHandle
HandlerInterceptor2…preHandle
HandlerInterceptor2…postHandle
HandlerInterceptor1…postHandle
HandlerInterceptor2…afterCompletion
HandlerInterceptor1…afterCompletion
preHandle按照攔截器的順序執行
postHandle和afterCompletion都是按照配置的攔截器逆順序執行 - 攔截器1放行,攔截器2不放行
HandlerInterceptor1…preHandle
HandlerInterceptor2…preHandle
HandlerInterceptor1…afterCompletion
只要preHandle放行了,那麼就會執行對應攔截器的afterCompletion方法
只要有一個攔截器的preHandle不放行,所有的攔截器的postHandle都不會執行 - 都不放行
HandlerInterceptor1…preHandle
前邊的攔截器不放行,後邊攔截器不執行。
實現統一異常處理
定義一個攔截器,在afterCompletion實現異常處理。
必須要將此攔截器配置第一個位置,且preHandle要放行。