一、拦截器介绍
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