一、攔截器介紹
SpringMVC提供了攔截器機制,允許在目標方法允許之前或之後進行一些其他處理。
SpringMVC提供的攔截器是一個接口HandlerInterceptor
。
preHandle
:在目標方法前調用;返回true,(chain.doFilter)放行;返回false不放行。postHandle
:在目標方法調用之後運行。afterCompletion
:在請求整個完成(來到目標頁面)之後運行,即資源響應之後。(注意:afterCompletion類似於finally,總是會執行
)
二、攔截器的使用步驟
1.實現HandlerInterceptor接口
- 使用攔截器需要實現HandlerInterceptor接口,重寫其中的方法。
public class MyFirstInterceptor implements HandlerInterceptor {
/**
* 目標方法運行之前
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
System.out.println("MyFirstInterceptor...preHandle");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("MyFirstInterceptor...postHandle");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
System.out.println("MyFirstInterceptor...afterCompletion");
}
}
2.配置攔截器
攔截所有請求
<mvc:interceptors>
<bean class="com.gql.controller.MyFirstInterceptor"></bean>
</mvc:interceptors>
攔截指定請求
<mvc:interceptor>
<mvc:mapping path="/test01"/>
<bean class="com.gql.controller.MyFirstInterceptor"></bean>
</mvc:interceptor>
三、攔截器的執行順序
單攔截器的執行順序
如上圖,假設在前端頁面發送請求,經過處理器後返回到響應頁面,在配置好單個## 多攔截器的執行順序
如上圖,假設在前端頁面發送請求,經過處理器後返回到響應頁面,在配置好兩個攔截器的情況下,整個流程執行結果Console打印如下:
MyFirstInterceptor...preHandle
MySecondInterceptor...preHandle
handler:test01...//處理器執行
MySecondInterceptor...preHandle
MyFirstInterceptor...postHandle
success.jsp//返回到響應頁面
MySecondInterceptor...preHandle
MyFirstInterceptor...afterCompletion