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 从而大家可以在配置拦截器的时候加以考虑此顺序。
拦截器配置所影响的直接属性
第一,二种配置添加的是AbstractUrlHandlerMapping的adaptedInterceptors属性
第三种配置 添加的是AbstractHandlerMapping 的interceptors属性(Spring初始化此HandlerMapping时候重新配置给adaptedInterceptors属性的。
扩展原则
Spring 最终是在DispatcherServlet.doDispatch 中按照HandlerExecutionChain.interceptorList的顺序一一执行拦截器。所以可通过给HandlerExecutionChain.interceptors、AbstractUrlHandlerMapping.mappedInterceptors、AbstractHandlerMapping.adaptedInterceptors注入自己的拦截器来实现灵活多层的拦截器机制。
注意点:重写Spring 的 AbstractUrlHandlerMapping的lookupHandler方法的话请返回的handler不等于null时必须 instanceof HandlerExecutionChain,要不然所配置的AbstractUrlHandlerMapping.mappedInterceptors拦截器无法运行。因为此段实现中spring有段不合理的设计(尽是本人的看法)。
有空时会将拦截器扩展部分代码贴出来……
来源:oschina
链接:https://my.oschina.net/u/867420/blog/97310