SpringMVC拦截器详解[附带源码分析]

参考:https://www.cnblogs.com/fangjian0423/p/springMVC-interceptor.html

1. HandlerExecutionChain类

  由HandlerMethod和Interceptor集合组成的类,会被HandlerMapping接口的getHandler方法获取。

SpringMVC拦截器详解[附带源码分析]_第1张图片

2. HandlerInterceptor接口

  SpringMVC拦截器详解[附带源码分析]_第2张图片

  SpringMVC拦截器基础接口。 

3. AbstractHandlerMapping

  HandlerMapping的基础抽象类。

SpringMVC拦截器详解[附带源码分析]_第3张图片

 

7. MappedInterceptor

  一个包括includePatterns和excludePatterns字符串集合并带有HandlerInterceptor的类。 很明显,就是对于某些地址做特殊包括和排除的拦截器。

   SpringMVC拦截器详解[附带源码分析]_第4张图片

源码分析

首先我们看下拦截器的如何被调用的。

Web请求被DispatcherServlet截获后,会调用DispatcherServlet的doDispatcher方法。

SpringMVC拦截器详解[附带源码分析]_第5张图片

SpringMVC拦截器详解[附带源码分析]_第6张图片

很明显地看到,在HandlerAdapter处理之后,以及处理完成之后会调用HandlerExecutionChain的方法。

HandlerExecutionChain的applyPreHandle、applyPostHandle、triggerAfterCompletion方法如下:

SpringMVC拦截器详解[附带源码分析]_第7张图片

SpringMVC拦截器详解[附带源码分析]_第8张图片

很明显,就是调用内部实现HandlerInterceptor该接口集合的各个对应方法。

 

下面我们看下HandlerExecutionChain的构造过程。

 HandlerExecutionChain是从HandlerMapping接口的getHandler方法获取的。

 HandlerMapping的基础抽象类AbstractHandlerMapping中:

SpringMVC拦截器详解[附带源码分析]_第9张图片

SpringMVC拦截器详解[附带源码分析]_第10张图片

我们看到,HandlerExecutionChain的拦截器是从AbstractHandlerMapping中的adaptedInterceptors和mappedInterceptors属性中获取的。

拦截器的配置

清楚了HandlerExecutionChain的拦截器属性如何构造之后,下面来看下SpringMVC是如何配置拦截器的。

1. *-dispatcher.xml配置文件中添加 配置


  
    
       
    
    
  

这里配置的每个都会被解析成MappedInterceptor。

其中子标签会被解析成MappedInterceptor的includePatterns属性;会被解析成MappedInterceptor的excludePatterns属性;会被解 析成MappedInterceptor的interceptor属性。

这个标签是被InterceptorsBeanDefinitionParser类解析。

SpringMVC拦截器详解[附带源码分析]_第11张图片

2. 配置RequestMappingHandlerMapping,并配置该bean对应的interceptors集合属性。 这里的interceptors集合是个Object类型的泛型集合。

  AbstractHandlerMapping抽象类只暴露了1个拦截器的set方法 -> interceptors。

  adaptedInterceptors和mappedInterceptors均没有暴露set方法,因此我们只能为RequestMappingHandlerMapping配置interceptors属性。

  其实AbstractHandlerMapping内部的 initInterceptors方法中,会遍历interceptors集合,然后判断各个项是否是MappedInterceptor、 HandlerInterceptor、WebRequestInterceptor。

  其中MappedInterceptor类型的拦截器会被加到mappedInterceptors集合 中,HandlerInterceptor类型的会被加到adaptedInterceptors集合中,WebRequestInterceptor类 型的会被适配成WebRequestHandlerInterceptorAdapter加到adaptedInterceptors集合中。

  SpringMVC拦截器详解[附带源码分析]_第12张图片

  SpringMVC拦截器详解[附带源码分析]_第13张图片

  如果读者配置了:

  那么配置如下:


  
    
    
  

  否则,可以去掉order这个属性的设置。

  为什么呢? 请参考楼主的另外一篇博客:http://www.cnblogs.com/fangjian0423/p/spring-Ordered-interface.html

  一般建议使用第一种方法。 

 

你可能感兴趣的:(java)