单个拦截器的执行流程
程序首先会执行拦截器类中的preHandle()方法,如果该方法的返回值true,则程序继续向下执行处理器当中的方法,否则不在向下执行;业务处理器(即控制器Controller类)处理完请求后,会执行postHandle()方法,然后会通过DispatcherServlet向前端返回响应;在DispatcherServlet处理完请求后,才会执行afterCompletion()方法。

多个拦截器的执行流程
当多个拦截器同时工作时,它们的preHandle()方法会按照配置文件中拦截器的配置顺序执行,而它们的postHandle()方法和afterCompletion()方法则会按照配置顺序的反序执行。
假设有两个拦截器Interceptor1和interceptor2,并且在配置文件中,Interceptor1拦截器配置在前。

java
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("request = " + request);
System.out.println("response = " + response);
System.out.println("handler = " + handler);
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
System.out.println("MyInterceptor.postHandle");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
System.out.println("MyInterceptor.afterCompletion");
}
}
java
@Configuration
@ComponentScan("com.xxx")
@EnableWebMvc
public class SpringmvcConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
//配置方案1:拦截全部请求
//registry.addInterceptor(new MyInterceptor());
//配置方案2:指定地址拦截
//* 任意一层字符串| ** 任意多层字符串
// registry.addInterceptor(new MyInterceptor()).addPathPatterns("/user/**");
//配置方案3:排除拦截
// registry.addInterceptor(new MyInterceptor()).addPathPatterns("/user/**").excludePathPatterns("/user/data1");
//先添加的拦截器优先级高,在外层。 后添加的拦截器优先级低,在内层。
registry.addInterceptor(new MyInterceptor());
registry.addInterceptor(new MyInterceptor1());
}
}