一、Spring拦截器简介
   
Spring拦截器是一种基于AOP的技术,本质也是使用一种代理技术,它主要作用于接口请求中的控制器,也就是Controller。因此它可以用于对接口进行权限验证控制。
下面我们看一个简单的拦截器例子
创建一个DemoInterceptor类实现HandlerInterceptor接口,重写preHandle(),postHandle(),afterCompletion() 三个方法,如下代码,我们就创建了一个Spring的拦截器。
public class DemoInterceptor implements HandlerInterceptor {
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
		System.out.println("preHandle......");
		return true;
	}
	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
		System.out.println("postHandle......");
	}
	@Override
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
		System.out.println("afterCompletion......");
	}
}
创建拦截器之后,我们还需要将其注册到Spring程序中,以便启用它。
注册拦截器
创建一个Spring配置类实现WebMvcConfigurer接口,并重写addInterceptors()方法,用于将拦截器添加到程序中。
@Configuration
public class MvcConfig implements WebMvcConfigurer {
   @Override
   public void addInterceptors(InterceptorRegistry registry) {
      registry.addInterceptor(new DemoInterceptor());
   }
}
创建一个接口用于查看拦截器的执行效果
@RestController
@RequestMapping("/interceptor")
public class DemoController {
   @GetMapping("/demo")
   public String demoAction() {
      System.out.println("interceptor-demo......");
      return "success";
   }
}
    测试接口
    
    
    
    如控制台打印,preHandle()方法在Controller方法执行之前执行,postHandle()与afterCompletion()方法都在打印语句之后,那它的执行顺序是什么样的呢?
   
    
    
    二、Spring拦截器执行源码解析
   
    主要执行代码在
    
     DispatcherServlet
    
    类中,其中有个**doDispatch()**的方法他就是做handler执行的,也就是执行接口处理逻辑,其中一系列的拦截器执行顺序写在此处。
   
protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
   HttpServletRequest processedRequest = request;
   HandlerExecutionChain mappedHandler = null;
   boolean multipartRequestParsed = false;
   WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
   try {
      ModelAndView mv = null;
      Exception dispatchException = null;
      try {
         processedRequest = checkMultipart(request);
         multipartRequestParsed = (processedRequest != request);
     
版权声明:本文为m0_54850467原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
