文档章节

Spring 拦截器机制研究与扩展

alex.tong
 alex.tong
发布于 2012/12/20 17:56
字数 497
阅读 891
收藏 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
struts+spring+hibernate 整合spring security 2.X

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

Beyond-Bit
2012/07/01
0
4
五种Spring事务配置的方式

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

yzbty23
2016/05/06
115
0
springmvc集成jfinal微信 微信服务号开发

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

孙帅帅
2016/11/08
1K
3
MyBatis整合Spring的实现(7)

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

tara_qri
2015/10/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

jQuery学习笔记180923

jQuery 操作 CSS jQuery 拥有若干进行 CSS 操作的方法。我们将学习下面这些: addClass() - 向被选元素添加一个或多个类 removeClass() - 从被选元素删除一个或多个类 toggleClass() - 对被选...

颖伙虫
26分钟前
0
0
[python] colorama 模块 - 改变控制台输出文本的颜色

除了使用 PyQt 这样的图形化开发框架外,基本上 python 程序都是跑在控制台中的。很多时候,单纯使用黑白的文字不能很好地突出我们要显示的信息。有时候我们需要将错误的提示使用红色标注,而...

cometeme
31分钟前
0
0
Makefile 学习 2 - 基于若干 Blog 的汇总

基于若干 Blog 汇总的 makefile 教程 陈皓 https://blog.csdn.net/haoel/article/details/2886 Makefile 进阶 1. Makefile 中的内容 显式规则。显式规则说明了,如何生成一个或多的的目标文件...

公孙衍
47分钟前
0
0
NIO与BIO的区别、NIO的运行原理和并发使用场景

NIO(Non-blocking I/O,在Java领域,也称为New I/O),是一种同步非阻塞的I/O模型,也是I/O多路复用的基础,已经被越来越多地应用到大型应用服务器,成为解决高并发与大量连接、I/O处理问题的...

Java干货分享
今天
1
0
72.告警系统邮件引擎 运行告警系统

20.23/20.24/20.25 告警系统邮件引擎 20.26 运行告警系统 20.23/20.24/20.25 告警系统邮件引擎 邮件首先要有一个mail.py,以下。 因为我们之前zabbix的时候做过,就可以直接拷贝过来 mail.s...

王鑫linux
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部