- Spring MVC的拦截器(Interceptor)与Java Servlet的过滤器(Filter)类似,它主要用于拦截用户的请求并做相应的处理。通常应用在权限验证、记录请求信息的日志、判断用户是否登录等功能上。
- 在Spring MVC框架中,定义一个拦截器,需要对拦截器进行定义和配置。
- 定义一个拦截器可以通过两种方式:
- 一种是通过实现HandlerInterceptor接口或继承HandlerInterceptor接口的实现类来定义;
- 另一种是通过实现WebRequestInterceptor接口或继承WebRequestInterceptor接口的实现类来定义。
实现HandlerInterceptor接口,并实现了接口中的三个方法。
- preHandle():在控制器的处理请求方法前执行,其返回值表示是否中断后续操作。返回true表示继续向下执行,返回false表示中断后续操作。
- postHandle():在控制器的处理请求方法调用之后,解析视图之前执行。可以通过此方法对请求域中的模型和视图做进一步的修改。
- afterCompletion():在控制器的处理请求方法执行完成后执行,即视图渲染结束后执行。可以通过此方法实现一些资源清理、记录日志信息等工作。
- 在配置文件中,如果只定义了一个拦截器,程序首先将执行拦截器类中的preHandle()方法,如果该方法返回true,程序将继续执行控制器中处理请求的方法,否则中断执行。如果preHandle()方法返回true,并且控制器中处理请求的方法执行后返回视图前,将执行postHandle()方法。返回视图后,才执行afterCompletion()方法。

Web应用中通常有多个拦截器同时工作,这时它们的preHandle()方法将按照配置文件中拦截器的配置顺序执行,而它们的postHandle()方法和afterCompletion()方法则按照配置顺序的反序执行。
注意,当其中一个preHandle方法返回false后,按配置顺序,后面的preHandle方法都不会运行了,而控制器和所有的后置方法postHandle也不会再运行。执行过preHanlde方法且该方法返回为true的拦截器的完成方法afterCompletion会按照配置的逆序运行。
