拦截器和 servlet 中的过滤器差不多,它主要用于拦截用户请求并作相应的处理。
1. 定义拦截器的方式
定义拦截器有两种方式:
- 自定义类实现
HandlerInterceptor接口,或者继承该接口的实现类 - 实现
WebRequestInterceptor接口,或继承该接口的实现类
举例说明:
public class MyInterceptor implements HandlerInterceptor {public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception {return false;}public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {}public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception e) throws Exception {}}
上面代码中,自定义了一个拦截器类 MyInterceptor ,并且实现了 HandlerInterceptor 接口中的三个默认方法。
preHandle():该方法会在控制器方法前执行,其返回值表示是否中断后续操作。返回true,表示继续向下执行;返回false,会中断后续的所有操作(包括调用下一个拦截器和控制器类中的方法执行等)postHandle():该方法会在控制器方法调用之后,且解析视图之前执行。可以通过此方法对请求域中的模型和视图做出进一步的修改afterCompletion():该方法会在整个请求完成,即视图渲染结束之后执行。可以通过此方法实现一些资源清理、记录日志信息等工作
2. 拦截器的配置
开发拦截器就像开发 servlet 或者 filter 一样,需要在配置文件进行配置,配置代码如下:
<!--配置拦截器, /**: 表示拦截所有请求--><mvc:interceptors><mvc:interceptor><mvc:mapping path="/**"/><bean class="tech.kc.interceptor.MyInterceptor"/></mvc:interceptor></mvc:interceptors>
3. 拦截器的执行流程
3.1 单个拦截器的执行流程
单个拦截器,在程序中的执行流程如下图所示:
- 程序先执行
preHandle()方法,如果返回值为 true,则程序会继续向下执行处理器中的方法,否则将不再向下执行 - 在业务处理器(即控制器Controller类)处理完请求后,会执行
postHandle()方法,然后会通过DispatcherServlet 向客户端返回响应 - 在DispatcherServlet处理完请求后,才会执行
afterCompletion()方法
3.2 多个拦截器的执行流程
单个拦截器,在程序中的执行流程如下图所示:
当有多个拦截器同时工作时,它们的 preHandle() 方法会按照配置文件中拦截器的配置顺序执行,而它们的postHandle() 方法和 afterCompletion() 方法则会按照配置顺序的反序执行。
