拦截器和 servlet 中的过滤器差不多,它主要用于拦截用户请求并作相应的处理。

1. 定义拦截器的方式

定义拦截器有两种方式:

  • 自定义类实现 HandlerInterceptor 接口,或者继承该接口的实现类
  • 实现 WebRequestInterceptor 接口,或继承该接口的实现类

举例说明:

  1. public class MyInterceptor implements HandlerInterceptor {
  2. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception {
  3. return false;
  4. }
  5. public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
  6. }
  7. public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception e) throws Exception {
  8. }
  9. }

上面代码中,自定义了一个拦截器类 MyInterceptor ,并且实现了 HandlerInterceptor 接口中的三个默认方法。

  • preHandle():该方法会在控制器方法前执行,其返回值表示是否中断后续操作。返回true,表示继续向下执行;返回false,会中断后续的所有操作(包括调用下一个拦截器和控制器类中的方法执行等)
  • postHandle():该方法会在控制器方法调用之后,且解析视图之前执行。可以通过此方法对请求域中的模型和视图做出进一步的修改
  • afterCompletion():该方法会在整个请求完成,即视图渲染结束之后执行。可以通过此方法实现一些资源清理、记录日志信息等工作

2. 拦截器的配置

开发拦截器就像开发 servlet 或者 filter 一样,需要在配置文件进行配置,配置代码如下:

  1. <!--配置拦截器, /**: 表示拦截所有请求-->
  2. <mvc:interceptors>
  3. <mvc:interceptor>
  4. <mvc:mapping path="/**"/>
  5. <bean class="tech.kc.interceptor.MyInterceptor"/>
  6. </mvc:interceptor>
  7. </mvc:interceptors>

3. 拦截器的执行流程

3.1 单个拦截器的执行流程

单个拦截器,在程序中的执行流程如下图所示:
图片.png

  1. 程序先执行 preHandle() 方法,如果返回值为 true,则程序会继续向下执行处理器中的方法,否则将不再向下执行
  2. 在业务处理器(即控制器Controller类)处理完请求后,会执行 postHandle() 方法,然后会通过DispatcherServlet 向客户端返回响应
  3. 在DispatcherServlet处理完请求后,才会执行 afterCompletion() 方法

3.2 多个拦截器的执行流程

单个拦截器,在程序中的执行流程如下图所示:
图片.png
当有多个拦截器同时工作时,它们的 preHandle() 方法会按照配置文件中拦截器的配置顺序执行,而它们的postHandle() 方法和 afterCompletion() 方法则会按照配置顺序的反序执行。