Spring 拦截器机制研究与扩展

一曲冷凌霜 提交于 2019-12-03 23:33:54

Spring 拦截器配置有以下三种

 第一种 

<mvc:interceptors>  
     <bean class="alex.tong.mvc.GlobalHandlerInterceptor" />  
</mvc:interceptors>

 第二种 

<mvc:interceptors>
    <mvc:interceptor>
       <mvc:mapping path="/**" />
       <bean class="alex.tong.mvc.interceptor.GlobalHandlerInterceptor" />
    </mvc:interceptor>
</mvc:interceptors>

 第三种  对指定HandlerMapping加拦截器

<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
    <property name="interceptors">
        <list>
            <bean class="alex.tong.mvc.interceptor.GlobalHandlerInterceptor" />
        </list>
    </property>
</bean>
对比: 

   第一、二种配置是在所有UrlHandlerMapping.mappedInterceptors属性注入所配置的拦截器, 从而打到全局拦截

   优点:1.可以模拟全局拦截器。2.可以配置Url path pattern 

   缺点:1.在于不能重复定义,你要是在某个jar包里配置了一次之后在外面配置无法生效的。2.对所有请求都进行拦截,从而性能的开销和请求的判断是不得不考虑的。所以只适合最终开发者使用,不适合做代码封装。

   第三种 对指定**handlerMapping 注册配置拦截器

   优点:拦截目标性强,适合做前后业务处理。

   缺点:只能拦截所配handlerMapping配置的请求

  从spring源码分析得出HandlerExecutionChain添加拦截器的顺序是HandlerExecutionChain.interceptors->AbstractUrlHandlerMapping.mappedInterceptors->AbstractHandlerMapping.adaptedInterceptors 从而大家可以在配置拦截器的时候加以考虑此顺序。

拦截器配置所影响的直接属性

   第一,二种配置添加的是AbstractUrlHandlerMappingadaptedInterceptors属性   

   第三种配置 添加的是AbstractHandlerMappinginterceptors属性(Spring初始化此HandlerMapping时候重新配置给adaptedInterceptors属性

扩展原则

  Spring 最终是在DispatcherServlet.doDispatch 中按照HandlerExecutionChain.interceptorList的顺序一一执行拦截器。所以可通过给HandlerExecutionChain.interceptors、AbstractUrlHandlerMapping.mappedInterceptors、AbstractHandlerMapping.adaptedInterceptors注入自己的拦截器来实现灵活多层的拦截器机制。 

   注意点:重写Spring 的 AbstractUrlHandlerMapping的lookupHandler方法的话请返回的handler不等于null时必须 instanceof HandlerExecutionChain,要不然所配置的AbstractUrlHandlerMapping.mappedInterceptors拦截器无法运行。因为此段实现中spring有段不合理的设计(尽是本人的看法)

  有空时会将拦截器扩展部分代码贴出来……

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!