设为首页 加入收藏

TOP

Struts2 拦截器配置以及实现
2017-06-26 10:23:02 】 浏览:4000
Tags:Struts2 拦截 配置 以及 实现

@(Java ThirdParty)[Struts|Interceptor]


Struts2的拦截器应用于Action,可以在执行Action的方法之前,之后或者两者。用于处理一些公共的方法,而不影响原有的代码,并且使得可以关注功能的实现,分离关注点。比如防止重复提交等。
如下图(图片来自Struts2文档Interceptor章节):


注:以下配置均来自于Struts2官方的例子
Struts2内置了一些拦截器,也可以通过实现Interceptor接口来自定义拦截器。


如下,在struts.xml中配置自定义拦截器以及引用定义的拦截器:


如果定义多个拦截器,像上面那样一个个引用显然是很费劲的,这里可以将多个打包为一个拦截器栈,直接引用该拦截器栈即可:


在先介绍Struts2拦截器实现时,需要先介绍一个设计模式,拦截过滤器,Struts2采用了该设计模式来实现,文档中注解了说明是使用Command设计模式,但是我觉得用Intercepting filter来理解比较好理解。


在wiki中Intercepting Filter定义为:JavaEE设计模式,用于创建可插拔式过滤器,用于处理通用的服务,而不需要改变和兴请求的处理代码。这涉及了四个组件:Filter Manager,Filter chain,Filters,Target。如下:
在下图,可以看成FilterManager维护着一系列的Filter,并且知道Target,这里可以实现为:FilterManager内部维护一个List<Filter>,该List作为Filter Chain。
注:图片来自Wiki


处理流程如下:
注:图片来自Wiki


Struts2中DefaultActionInvocation可以看做一个FilterManager,其中有Iterator<InterceptorMapping>,可以看做FilterChain,即包含了所有需要拦截该Action的Interceptor,其中Object action为真正的Target。如下图:


Interceptor接口:


主要执行流程在DefaultActionInvocation.invoke方法中,该方法用递归来实现链式调用(和Tomcat中实现FIlter一样):


Tomcat中Filter的实现和上面差不多,不过其中的类名和概念的名称比较匹配。如下:


ApplicationDispatcher通过使用FilterChain来实现Filter链式调用。
其中ApplicationFIlterChain.internalDoFilter为核心的代码:


Wiki:
https://en.wikipedia.org/wiki/Intercepting_filter_pattern
https://en.wikipedia.org/wiki/Interceptor_pattern
官方文档:
http://struts.apache.org/docs/interceptors.html


推荐阅读:


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇JDK AtomicInteger 源码分析 下一篇Spring Cache 心得笔记

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目