文档章节

Spring 拦截器机制研究与扩展

alex.tong
 alex.tong
发布于 2012/12/20 17:56
字数 497
阅读 897
收藏 7

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有段不合理的设计(尽是本人的看法)

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

© 著作权归作者所有

共有 人打赏支持
alex.tong
粉丝 3
博文 2
码字总数 686
作品 0
浦东
产品经理
私信 提问
Java过滤器,SpringMVC拦截器之间的一顺序点关系

由于最近做的项目中有一部分是接口远程调用,用到了接入权限和业务权限的鉴定,需要采用SpringMVC的拦截器,以前用Struts2的时候用过拦截器,而SpringMVC的拦截器功能之前没研究过,所以这次...

凯文加内特
2015/05/12
0
0
五种Spring事务配置的方式

前段时间对Spring的事务配置做了比较深入的研究,在此之间对Spring的事务配置虽说也配置过,但是一直没有一个清楚的认识。通过这次的学习发觉Spring的事务配置只要把思路理清,还是比较好掌握...

yzbty23
2016/05/06
115
0
struts+spring+hibernate 整合spring security 2.X

好吧!在这个夜深人静的时候,既然没有睡意,那就刚好整理一个我的博文,osc挺好的,以后技术博文就在这里整理了!前几天因为项目需求spring security 机制,所以就自己研究了一下,到官方下...

Beyond-Bit
2012/07/01
0
4
MyBatis整合Spring的实现(7)

MyBatis整合Spring的实现(6)中分析了方法propertiesElement,下面继续往下分析代码: 1 方法typeAliasesElement private void typeAliasesElement(XNode parent) { if (parent != null) { ......

tara_qri
2015/10/26
0
0
springmvc集成jfinal微信 微信服务号开发

最近研究微信服务号开发,发现jfinal家封装的SDK还是不错的,于是就定下来用它了。 那么问题来了:git上有demo,那么如何集成到自己的项目中呢?研究研究呗。我们框架使用的是springmvc,下面...

孙帅帅
2016/11/08
1K
3

没有更多内容

加载失败,请刷新页面

加载更多

求推广,德邦快递坑人!!!!

完全没想好怎么来吐槽自己这次苦逼的德邦物流过程了,只好来记一个流水账。 从寄快递开始: 2019年1月15日从 德邦物流 微信小app上下单,截图如下: 可笑的是什么,我预约的是17号上门收件,...

o0无忧亦无怖
昨天
3
0
Mac Vim配置

1.升级 vim   我自己 MacBook Pro 的系统还是 10.11 ,其自带的 vim 版本为 7.3 ,我们将其升至最新版: 使用 homebrew : brew install vim --with-lua --with-override-system-vim 这将下...

Pasenger
昨天
4
0
vmware安装Ubuntu上不了网?上网了安装不了net-tools,无法执行ifconfig?

1.重新设置网络适配器还是不行,如下指定nat 2.还需要指定共享网络,我是在无线环境下 3.无法执行ifconfig https://packages.ubuntu.com/bionic/net-tools到这个网站下载net-tools的deb文件...

noob_chr
昨天
1
0
解决SVN:E210007无法协商认证机制

svn:E210007 svn: Cannot negotiate authentication mechanism 执行下面代码即可 sudo yum install cyrus-sasl cyrus-sasl-plain cyrus-sasl-ldap...

临江仙卜算子
昨天
2
0
java8的时间和`Date`的对比

java8的时间和Date的对比 java8提供了新的时间接口。相对Date,Calendar,个人感觉最大的好处是对时间操作的学习成本很低,比Calendar低。 1. LocalDate,LocalTime,LocalDateTime LocalDate 代...

北风刮的不认真了
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部