一、什么是拦截器?
提到拦截器,说得好听点,就是安全性检查,说得不好听,就是强盗。拦截器在程序应用中就是那个扮演强盗半路打劫的角色。 在我们的日常编程中少不了写一些 重复的代码,例如在一个地方中写了一段代码,后来发现这段代码在其它地方中同样需要,在传统的编程中我们一定会采取复制、粘贴的办法。如果这段代码只在这 一两个处需要,我们采取这种办法,还说的过去,但是如果系统对这段代码过于依赖,也就是这段代码在系统中出现的过多,如果那一天我们发现这段代码中在某些 地方还需要完善,我们要着个修改它们!!我估计没有人会这么做,它严重违反了软件开发中一条非常重要的可重用代码的规则,同时也是程序员非常讨厌的一件事,老是写重复代码会让一个程序员感到厌烦。说了这么多你一定知道我们为什么需要在程序中弄一个“劫匪”了吧。这个“劫匪”就是并不是劫取什么东西,只是为了在某个程序执行前后,动态的增加一些功能(以前所写通用代码块)或进行一些检查工作。那么这个拦截器到底是怎么实现的呢?实际上它是用Java中的动态代理来实现的
二、拦截器在Struts2中的应用
对于Struts2框架而言,正是大量的内置拦截器完成了大部分操作。像params拦截器将http请求中参数解析出来赋值给Action中对应的属性。Servlet-config拦截器负责把请求中HttpServletRequest实例和HttpServletResponse实例传递给Action……struts2内置的拦截器有很多,在此我就不一一列举了
那么怎么在struts2中定义自己的拦截器呢?
很简单Struts2为我们提供了一个Interceptor接口,该接口源代码如下:
publicinterfaceInterceptorextendsSerializable {
voiddestroy();
voidinit();
String intercept(ActionInvocation invocation)throwsException;
}
1)init():在拦截器执行之前调用,主要用于初始化系统资源。
2)destroty():与init()对应,用于拦截器执行之后销毁资源。
3)intercept():拦截器的核心方法,实现具体的拦截操作。与action一样,该方法也返回一个字符串作为逻辑视图。如果拦截器成功调用了action,则返回一个真正的,也就是该action中execute()方法返回的逻辑视图,反之,则返回一个自定义的逻辑视图。
通常我们使用拦截器并不需要申请资源,为此Struts2还为我们提供了一个AbstractInterceptor类,该类的init()和destroy()都是空实现。我们开发自己的拦截器只需要继承这个类就行了。
下面创建一个判断用户是否登录的拦截器。代码如下:
struts.xml中配置一下。
**
*
*@author<ahref="mailto:flustar2008@163.com">flustar</a>
*@version1.0
*Creationdate:Feb12,20085:05:28PM
*/
importjava.util.Map;
importcom.opensymphony.xwork2.Action;
importcom.opensymphony.xwork2.ActionInvocation;
importcom.opensymphony.xwork2.interceptor.AbstractInterceptor;
@SuppressWarnings("serial")
publicclassCheckLoginInterceptorextendsAbstractInterceptor{
@SuppressWarnings("unchecked")
publicStringintercept(ActionInvocationactionInvocation)throwsException{
System.out.println("beginchecklogininterceptor!");
//检查Session中是否存在user
Mapsession=actionInvocation.getInvocationContext().getSession();
Stringusername=(String)session.get("user");
if(username!=null&&username.length()>0){
//存在的情况下进行后续操作。
System.out.println("alreadylogin!");
returnactionInvocation.invoke();
}else{
//否则终止后续操作,返回LOGIN
System.out.println("nologin,forwardloginpage!");
returnAction.LOGIN;
}
}
}
创建好拦截器后,还不能使用,还需要我们在
下面看一下怎么配置拦截器。
<interceptors>
<interceptorname="checkLogin"class="com.myblog.interceptor.CheckLoginInterceptor"/>
</interceptors>
这个定义好的拦截器在Action中怎么使用呢?使用方法很简单,如下:
<actionname=" "class=" ">
<result> </result>
<interceptor-refname="checkLogin"/>
</action>
一旦我们为某个action引用了自定义的拦截器,struts2默认的拦截器就不会再起作用,因此还需要引用默认拦截器。
<actionname=" "class=" ">
<result> </result>
<interceptor-refname="checkLogin"/>
<interceptor-ref name="defaultStack" />
</action>
但是我们这么做似乎也不太方便,因为如果拦截器checkLogin需要被多个action引用的话,每一个都要配置一遍太麻烦了。我们可以把它定义成默认的拦截器。
<interceptors>
<interceptorname="checkLogin"class="com.myblog.interceptor.CheckLoginInterceptor"/>
<!—-定义一个拦截器栈-->
<interceptor-stackname="mydefault">
<interceptor-refname="defaultStack"/>
<interceptor-refname="checkLogin"/>
</interceptor-stack>
</interceptors>
<default-interceptor-refname="mydefault"/>
另外,struts2还为我们提供了一个方法过滤的拦截器MethodFilterInterceptor类,该类继承AbstractInterceptor类,重写了intercept(ActionInvocation invocation)并提供了一个新的方法doInterceptor(ActionInvocation invocation)抽象方法。该类的使用方法很简单,就不举例了。这个拦截器与以往的拦截器配置有所不同。那就是可以指定哪些方法需要被拦截,那些不需要。通常在引用该拦截器时指定。
<interceptor-refname=" ">
<paramname="exculdeMethods"></param>
<paramname="includeMethods"></param>
</interceptor-ref>
exculdeMethods:是不被拦截的方法,如果有多个以逗号分隔。
includeMethods:需要被拦截的方法,如果有多个以逗号分隔。
PS:该文章参考了别人的一篇文章,例子我也懒得改动了。不过挺好的。如果要掌握好struts2的拦截器原理还需要认真学习下java的动态代理,同时给个建议:在性能要求较高的项目里面,使用动态代理会降低系统的性能
获取当前请求action 和请求的方法
System.out.println("Action:"+invocation.getAction().getClass().getName());
System.out.println("Struts2中配置的Action:"+invocation.getProxy().getActionName());
System.out.println("调用的方法:"+invocation.getProxy().getMethod());
//获取action后附带参数
Mapparameters=aInvocation.getInvocationContext().getParameters();
分享到:
相关推荐
Struts2拦截器原理分析实例 博文链接:https://zmx.iteye.com/blog/457432
Struts2拦截器(Interceptor) Struts2拦截器(Interceptor)
在action执行之前先进行拦截器的拦截处理,然后再执行action的execute方法,返回给拦截器,再对应相应result
仿struts 2 拦截器原理
Struts2拦截器.ppt Struts2拦截器.ppt Struts2拦截器.ppt
struts2,Interceptor struts2拦截器实例,两套实例,一套是针对单个的action配置的,另一套实例是针对全局的action配置的拦截器interceptor
浅谈Struts2拦截器的原理与实现.docx
Struts2拦截器源程序 Struts2拦截器源程序 Struts2拦截器源程序 Struts2拦截器源程序 Struts2拦截器源程序
关于struts2 拦截器的详细的解释及其在开发中对struts2的拦截器的应用和拦截器在框架中的作用.
Struts2拦截器是在访问某个Action或Action的某个方法,字段之前或之后实施拦截,并且Struts2拦截器是可插拔的,拦截器是AOP的一种实现.
Struts2拦截器实现权限控制demo,我感觉对初学者还是有一定帮助的
NULL 博文链接:https://cmexico.iteye.com/blog/621208
struts2拦截器应用小例子,与大家共分享
struts2拦截器的使用说明文档,配置说明文档。可以看一下
基于struts2的拦截器测试,实现了页面的跳转,中间过程的拦截
其中,init和destroy方法会在程序开始和结束时各执行一遍,不管使用了该拦截器与否,只要在struts.xml中声明了该Struts2拦截器就会被执行。 intercept方法就是拦截的主体了,每次拦截器生效时都会执行其中的逻辑。
struts2拦截器和验证框架
使用struts的拦截器拦截一些敏感性的词或一些非法或不文秘的言论
创建自己struts2拦截器,手工创建自己的拦截器实现