实现拦截器的三种方法

标签: 方法 | 发表时间:2012-05-21 09:03 | 作者:vean_system
出处:http://blog.csdn.net

说是三种方法,实际上是一种方法,其实只要这个类实现了Interceptor接口,即可成为一个拦截器类。

第一种方法就是直接实现Interceptor接口,这样的话,就要实现这个接口中的三个方法。

第二种方法是继承自AbstractInterceptor类,这是个抽象类,实现了Interceptor接口,并且对里面的init()和destroy()方法进行空实现,而把intercept()方法设置为抽象方法,让继承它的子类去实现,这样的话,子类只要实现这个intercept()方法就可以了,比直接实现接口要简单一些。

第三种方法是继承自MethodFilterInterceptor,这个类叫做方法过滤拦截器,这个类继承自AbstractInterceptor,并且提供了一种机制,即可以指定对Action中某些方法进行拦截或者是不拦截,所谓拦截不拦截,指的就是拦截器中的intercept()方法是否被执行了,若没有执行,就是没有拦截,若执行了,就是拦截了。

第一、二种方法这里就不详细说明了,主要说一下第三种方法,即MethodFilterInterceptor的使用。

首先来看一下这个类的部分代码:

public abstract class MethodFilterInterceptor extends AbstractInterceptor {    
protected transient Logger log = LoggerFactory.getLogger(getClass());

protected Set<String> excludeMethods = Collections.emptySet();
protected Set<String> includeMethods = Collections.emptySet();

public void setExcludeMethods(String excludeMethods) {
this.excludeMethods = TextParseUtil.commaDelimitedStringToSet(excludeMethods);
}

public Set<String> getExcludeMethodsSet() {
return excludeMethods;
}

public void setIncludeMethods(String includeMethods) {
this.includeMethods = TextParseUtil.commaDelimitedStringToSet(includeMethods);
}

public Set<String> getIncludeMethodsSet() {
return includeMethods;
}

@Override
public String intercept(ActionInvocation invocation) throws Exception {
if (applyInterceptor(invocation)) {
return doIntercept(invocation);
}
return invocation.invoke();
}

protected boolean applyInterceptor(ActionInvocation invocation) {
String method = invocation.getProxy().getMethod();
// ValidationInterceptor
boolean applyMethod = MethodFilterInterceptorUtil.applyMethod(excludeMethods, includeMethods, method);
if (log.isDebugEnabled()) {
if (!applyMethod) {
log.debug("Skipping Interceptor... Method [" + method + "] found in exclude list.");
}
}
return applyMethod;
}

protected abstract String doIntercept(ActionInvocation invocation) throws Exception;

}

 

可以看到这里面有两个成员变量:includeMethods和excludeMethods,并且有对应的get/set方法,这两个变量的类型为String类型的集合,即可以放置多个String类型的数据,其实,这两个变量就是用来存放要拦截或者是不拦截的方法的名称的。includeMethods存放要进行拦截的方法名,excludeMethods存放不进行拦截的方法名。

 

在其中还实现了intercept方法,在里面经过某个判断后,调用了一个doIntercept()方法,这个方法是抽象的,就是要其子类去实现的。那么这个判断是什么呢?这个判断就是根据includeMethods和excludeMethods中存放的方法名,进行判断是否要对其进行拦截。

因为在类中已经实现了intercept()方法,而提供了一个抽象的doIntercept()方法,所以我们只要去实现这个抽象的方法,就可以实现针对到方法的拦截器了。

下面来个简单的例子:

拦截器类:     

package com.suo.interceptor;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;
import com.suo.listeners.BeforeResultListener;

public class MyInterceptor3 extends MethodFilterInterceptor {

@Override
protected String doIntercept(ActionInvocation invocation) throws Exception {

System.out.println("before MyInterceptor3 invoke !");

String result=invocation.invoke();

System.out.println("after MyInterceptor3 invoke !");

return result;
}
}
配置拦截器:     

<interceptor name="myInterceptor3" class="com.suo.interceptor.MyInterceptor3"></interceptor>
在action中引用拦截器:     

<action name="action1" class="com.suo.actions.Action1" method="myExecute">
<result name="success" type="chain">
<param name="actionName">action2</param>
</result>

<interceptor-ref name="myInterceptor3">
<param name="includeMethods">myExecute</param>
<param name="excludeMethods">execute</param><!--对myExecute进行拦截,对execute不拦截-->
</interceptor-ref>

</action>
作者:vean_system 发表于2012-5-21 9:03:03 原文链接
阅读:11 评论:0 查看评论

相关 [方法] 推荐:

模板方法

- - 博客园_首页
由于前两天刚好用到模板方法这个模式,而且这个模式相对来 比较简单实用,就写写个人的一些认知吧. 大家对宋丹丹和赵本山的小品里有一个很经典的台词一定不会陌生,而且还日常中经常引用:. 《钟点工》中宋丹丹问要把大象装冰箱,总共分几步. 赵本山就懵了,大象那么大,冰箱那么小,怎么才能把大象装冰箱里呢. 答案也很经典:三步:第1步,把冰箱门打开;第2步,把大象装进去;第3步,把冰箱门带上.

详解 equals() 方法和 hashCode() 方法

- - ImportNew
Java的基类Object提供了一些方法,其中equals()方法用于判断两个对象是否相等,hashCode()方法用于计算对象的哈希码. equals()和hashCode()都不是final方法,都可以被重写(overwrite). 本文介绍了2种方法在使用和重写时,一些需要注意的问题. Object类中equals()方法实现如下:.

mysql优化方法

- - 数据库 - ITeye博客
通过show status和应用特点了解各种SQL的执行频率. 通过SHOW STATUS可以提供服务器状态信息,也可以使用mysqladmin extended-status命令获得. SHOW STATUS可以根据需要显示session级别的统计结果和global级别的统计结果. 以下几个参数对Myisam和Innodb存储引擎都计数:.

WinDump使用方法

- - 研发管理 - ITeye博客
Windump是Windows环境下一款经典的网络协议分析软件,其Unix版本名称为Tcpdump. 它可以捕捉网络上两台电脑之间所有的数据包,供网络管理员/入侵分析员做进一步流量分析和入侵检测. 在这种监视状态下,任何两台电脑之间都没有秘密可言,所有的流量、所有的数据都逃不过你的眼睛(当然加密的数据不在讨论范畴之内,而且,对数据包分析的结果依赖于你的TCP/IP知识和经验,不同水平的人得出的结果可能会大相径庭).

下载Flickr图片方法

- wind - 让PPT设计NEW一NEW
        众所周知,Flickr是全球最大的在线图片分享网站,也是最早涉足web2.0的网站之一. 网站上面有很多非常漂亮的图片,这为那些“图片控”、“下载控”提供了一个非常好的途径. 可惜啊可惜,可惜的是,Flickr网站并非允许所有图片可以下载.         前几天,有个网友发微博私信给我,问我如何下载Flickr图片.

放手的7种方法

- imacee - 译言-每日精品译文推荐
来源Seven Ways to Let Go. 前言:学会放手是一门人生哲学,无端的执着总是给生活带来不快乐. 当人们总是在抱怨放下太难的时候,是不是可以从自身上寻找一些可以改进的地方呢. 下面让我们来探讨几条小建议吧,仅供参考. 一、拓宽自己的世界观并舍弃一些习惯. 学会放开,就要拒绝执行要求自己事事完美的命令,不要总是要求自己达到某个目标,取悦他人.

止咳的天然方法

- Jerrfey - 译言-每日精品译文推荐
来源Natural Ways to Suppress a Cough. 在你伸手拿咳嗽糖浆之前,试试这些天然疗法的其中之一吧. To make a tea, mix 2 teaspoons crushed leaves in 1 cup boiling water, cover, then steep for 10 minutes and strain..

雷军的方法论

- Leo - 《商业价值》杂志
雷军做小米的过程,实际上就是将他从金山和做天使投资人时所积累的方法论,付诸实践的过程. 1992年,雷军加入金山软件,任北京开发部总经理;1998年,雷军担任金山软件CEO;1999年,金山软件筹备上市;2007年,金山软件上市; 2个月后,雷军宣布离职. 这是雷军从23岁到38岁最重要的人生一页.

Doclist压缩方法简介

- flychen50 - 搜索技术博客-淘宝
本文是作者在学习doclist压缩时的一点总结,希望以尽可能简单明了的方式描述各个算法的思想和适用场景,帮助同学们理解和比较. 本文并不涉及具体的算法实现,代码请大家自行google. 这里需要强调的是“所谓的改进顺序”只是作者yy出来方便理解记忆,并不反应真实的压缩方法发展历程. 倒排表的基本组成部分,看例子:.

IPv6地址规划方法

- Power - cnBeta.COM
今年初ICANN和APNIC的IPv4地址池全部耗尽,亚太地区成为全球首个无法满足IPv4需求的地区. 伴随着我国互联网产业的高速增长以及未来三网 融合和物联网的发展,当前我国掌握的IPv4地址资源远无法满足高速增长的用户需求,我国将成为全球最早受地址匮乏影响的国家之一.