strut2自定义拦截器的步骤
struts2--拦截器总结

init: 该方法将在拦截器被创建后立即被调用, 它在拦截器的生命周期内只被调用一次.可以在该方法中对相关资源进行必要的初始化。
intercept: 每拦截一个动作请求, 该方法就会被调用一次.destroy: 该方法将在拦截器被销毁之前被调用, 它在拦截器的生命周期内也只被调用一次.定义自定义拦截器的步骤自定义拦截器:要自定义拦截器需要实现com.opensymphony.xwork2.interceptor.Interceptor接口:public class PermissionInterceptor implements Interceptor {private static final long serialVersionUID = -5178310397732210602L;public void init() {}public String intercept(ActionInvocation invocation) throws Exception {System.out.println("进入拦截器");if(session里存在用户){String result = invocation.invoke();//放行}else{return “logon”;}//System.out.println("返回值:"+ result);//return result;}}public void destroy() {}在struts.xml 文件中配置自定义的拦截器:<package name="itcast" namespace="/test" extends="struts-default"><interceptors><!-- 注册自定义的拦截器--><interceptor name=“permission" class="cn.itcast.aop.PermissionInterceptor" /><!-- 自定义拦截器栈--><interceptor-stack name="permissionStack"><!-- 引用默认拦截器栈--><interceptor-ref name="defaultStack" /><!-- 引用自定义的拦截器--><interceptor-ref name=" permission " /></interceptor-stack></interceptors><action name="helloworld_*" class="cn.itcast.action.HelloWorldAction" method="{1}"> <result name="success">/WEB-INF/page/hello.jsp</result><interceptor-ref name="permissionStack"/></action><!-- 将自定义的拦截器栈设为默认的拦截器栈--><default-interceptor-ref name=“permissionStack”/></package>因为struts2中如文件上传,数据验证,封装请求参数到action等功能都是由系统默认的defaultStack中的拦截器实现的,所以我们定义的拦截器需要引用系统默认的defaultStack,这样应用才可以使用struts2框架提供的众多功能。
struts2_拦截器(Interceptors)

拦截器的工作原理如上图,每一个Action请求都包装在一系列的拦截器的内部。
拦截器可以在Action执行直线做相似的操作也可以在Action执行直后做回收操作。
每一个Action既可以将操作转交给下面的拦截器,Action也可以直接退出操作返回客户既定的画面。
如何自定义一个拦截器?自定义一个拦截器需要三步:1 自定义一个实现Interceptor接口(或者继承自AbstractInterceptor)的类。
2 在strutx.xml中注册上一步中定义的拦截器。
3 在需要使用的Action中引用上述定义的拦截器,为了方便也可将拦截器定义为默认的拦截器,这样在不加特殊声明的情况下所有的Action都被这个拦截器拦截。
Interceptor接口声明了三个方法:public interface Interceptor extends Serializable {void destroy();void init();String intercept(ActionInvocation invocation) throws Exception; }Init方法在拦截器类被创建之后,在对Action镜像拦截之前调用,相当于一个post-constructor方法,使用这个方法可以给拦截器类做必要的初始话操作。
Destroy方法在拦截器被垃圾回收之前调用,用来回收init方法初始化的资源。
Intercept是拦截器的主要拦截方法,如果需要调用后续的Action或者拦截器,只需要在该方法中调用invocation.invoke()方法即可,在该方法调用的前后可以插入Action调用前后拦截器需要做的方法。
如果不需要调用后续的方法,则返回一个String类型的对象即可,例如Action.SUCCESS。
另外AbstractInterceptor提供了一个简单的Interceptor的实现,这个实现为:public abstract class AbstractInterceptor implements Interceptor {public void init() {}public void destroy() {}public abstract String intercept(ActionInvocation invocation) throws Exception;}在不需要编写init和destroy方法的时候,只需要从AbstractInterceptor继承而来,实现intercept方法即可。
Struts2自定义拦截器

Struts2自定义拦截器6.3 自定义的拦截器6.3.1 什么是自定义的拦截器所谓自定义的拦截器,就是由我们自己定义并实现的拦截器,而不是由Struts2定义好的拦截器。
虽然Struts2的预定义拦截器已经满足了大多数情况的需要。
但在有些时候,我们可能会根据项目的实际需要而自定义一些拦截器,来实现一些特别的功能。
比如,我们可能认为Struts2预置的logger拦截器功能比较弱,我们希望在任何一个action运行的时候,都会先打印出所访问的动作类Action,再打印出所有的request参数,最后打印出要跳转到的jsp。
这个功能并不影响真正的业务逻辑,但是对调试错误是非常有帮助的,免的我们再手工一一对应和查看。
6.3.2 开发自定义拦截器好了,了解了什么是自定义的拦截器过后,一起来看看究竟如何实现自定义的拦截器。
其实在Struts2里面,要实现自定义的拦截器是非常简单的,只要写一个实现Interceptor接口的类就可以了。
也就是说,所有的拦截器都要实现com.opensymphony.xwork2.interceptor.Interceptor接口,这个接口中定义如下:java代码:查看复制到剪贴板打印public interface Interceptor extends Serializable{ void destroy(); void init(); String intercept(ActionInvocation invocation) throws Exception; }方法的基本说明如下:init方法就类似于构造方法,用于初始化一些相关资源destory方法类似于析构方法,用于释放资源intercept方法,就是拦截器执行的处理方法,我们要实现的功能主要就写在这个方法里面。
对于intercept方法,再说明几点:(1)在intercept方法中写“invocation.invoke();”,这句话的意思是继续运行拦截器后续的处理,如果这个拦截器后面还有拦截器,那么会继续运行,一直到运行Action,然后执行Result。
Struts2拦截器和监听器

Struts2拦截器和监听器第一种方法:直接implements实现com.opensymphony.xwork2.interceptor.InterceptorJava代码第二种方法直接extends com.opensymphony.xwork2.interceptor.AbstractInterceptor 这种方法是少了destroy,init方法Java代码第三种方法直接extends com.opensymphony.xwork2.interceptor.MethodFilterInterceptor这种方法能对Action里面的方法级进行控制,是否执行这个方法Java代码然就是配置Xml代码里面分interceptor和interceptor-stackstack也能引用stackdefault-interceptor-ref表示Action如果不指定interceptor就用这个default的extends="struts-default"表示这个XML文件是extends 另一个xml的,名字叫struts-default在这个XML中,配置了一个常用的interceptor可以去Core包中找到这个XMLinterceptor配置很灵活的。
如果要写自己的interceptor就要把<interceptor-ref name="defaultStack"></interceptor-ref>默认的给加上,当然也可以自己配置。
interceptor的参数Xml代码这个是因为MethodFilterInterceptor 里有这两个成员变量,如果你自己的interceptor要带参数的话就要相应的Action里面写到成员变量,并加上get,set方法Java代码监听器首先要实现com.opensymphony.xwork2.interceptor.PreResultListener类并重写里面的方法beforeResultJava代码然后再在拦截器里面调用Java代码监听器是在这个拦截器完成别的拦截器之后调用的struts2 Action获得HttpSession,HttpServletRequest,HttpSevletResponse的方法非IOC方式这种方式主要是利用了com.opensymphony.xwork2.ActionContext类以及org.apache.struts2.ServletActionContext类Java代码主要是这两个类com.opensymphony.xwork2.ActionContext和org.apache.struts2.ServletActionContext都对request等进行了大量的封装,直接调用方法就可以获和更好一点的IOC方式action类实现ServletRequestAware接口,并新建一个HttpServletRequest requestJava代码}这些获得HttpServletRequest等对象需要implments的接口都在org.apache.struts2.interceptor下面如Apllication的是ApplicationAware如HttpSession的是SessionAware(struts2的Session都被封装成Map了)如HttpServletRequest的是ServletRequestAware如HttpServletResponse的是ServletResponseAware。
struts2-2(拦截器)

17
18
• validation拦截器
– 调用验证框架进行数据验证
• workflow拦截器
– 调用Action类的validate(),执行编码验证
11
Struts 2默认拦截器栈
• struts-default.xml中定义一个defaultStack拦截器栈,并将其指 定为默认拦截器 • 只要在定义包的过程中继承struts-default包,那么defaultStac k将是默认的拦截器
• 8、Action执行完毕,ActionInvocation负责根据结果码字符 串在struts.xml的配置中找到对应的返回结果 • 9、拦截器被再次执行
• 10、过滤器被再次执行
4
Struts 2核心接口和类
• ActionMapper
– 根据请求的URI查找是否存在对应Action调用
• ActionMapping
10
Struts 2自带拦截器
• Params拦截器
– 负责将请求参数设置为Action属性
• servletConfig拦截器
– 将源于Servlet API的各种对象注入到Action
• fileUpload拦截器
– 对文件上传提供支持
• exception拦截器
– 捕获异常,并且将异常映射到用户自定义的错误页面
12
配置拦截器
<package name="packName" extends="struts-default" namespace="/manage"> <interceptors> <!-- 定义拦截器 --> <interceptor name="interceptorName" class="interceptorClass" /> <!-- 定义拦截器栈 --> <interceptor-stack name="interceptorStackName"> <!--指定引用的拦截器--> <interceptor-ref name="interceptorName|interceptorStackName" /> </interceptor-stack> </interceptors> <!--定义默认的拦截器引用--> <default-interceptor-ref name="interceptorName|interceptorStackName" /> <action name="actionName" class="actionClass"> <!—为Action指定拦截器引用--> <interceptor-ref name="interceptorName|interceptorStackName" /> <!--省略其他配置--> </action> </package>
Struts2的拦截器配置

拦截器实例
public class SimpleInterceptor extends AbstractInterceptor { private String name; public void setName(String name) { = name; } public String intercept(ActionInvocation invocation) throws Exception { LoginAction action = (LoginAction)invocation.getAction(); ......... String result = invocation.invoke(); ...... return result; } }
Struts 专题篇
第九章 Struts 2 的拦截器 主讲:陈宝峰
内容描述
● ● ● ● ● ●
拦截器概述 拦截器配置 使用拦截器的配置 使用默认拦截器的配置 拦截器实例 方法过滤
拦截器概述
● ●
拦截器是 Struts 2 中的重要组成部分 大量的内建拦截器完成了大部分的 Struts2 框架的工作
结束
使用默认拦截器的配置
<package name=” 包名” > <interceptors> <interceptor name=” 拦截器名 1” class=”......” /> ...... <interceptor-stack name=” 拦截器栈名 1”> <interceptor-ref name=” 拦截器名 1” /> ...... </interceptor-stack> </interceptors> <default-interceptor-ref name=” 拦截器名或拦截器栈名” /> <action ...... /> </package>
strtus2拦截器使用说明
1. 理解拦截器1.1. 什么是拦截器:拦截器,在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。
拦截是AOP的一种实现策略。
在Webwork的中文文档的解释为——拦截器是动态拦截Action调用的对象。
它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行。
同时也是提供了一种可以提取action中可重用的部分的方式。
谈到拦截器,还有一个词大家应该知道——拦截器链(Interceptor Chain,在Struts 2中称为拦截器栈Interceptor Stack)。
拦截器链就是将拦截器按一定的顺序联结成一条链。
在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用。
1.2. 拦截器的实现原理:大部分时候,拦截器方法都是通过代理的方式来调用的。
Struts 2的拦截器实现相对简单。
当请求到达Struts 2的ServletDispatcher时,Struts 2会查找配置文件,并根据其配置实例化相对的拦截器对象,然后串成一个列表(list),最后一个一个地调用列表中的拦截器。
如下图:2. 拦截器的配置Struts 2已经为您提供丰富多样的,功能齐全的拦截器实现。
大家可以至struts2的jar包内的struts-default.xml查看关于默认的拦截器与拦截器链的配置。
Struts2(XWork)提供的拦截器的功能说明:拦截器名字说明Alias Interceptoralias在不同请求之间将请求参数在不同名字件转换,请求内容不变Chaining Interceptorchain让前一个Action的属性可以被后一个Action访问,现在和chain类型的result(<result type=”chain”>)结合使用。
通过代码实例跟我学Struts2框架从入门到精通——如何自定义Struts2框架中的拦截器组件的应用实例
1.1通过代码实例跟我学Struts2框架从入门到精通——如何自定义Struts2框架中的拦截器组件的应用实例1.1.1回顾和进一步了解Action组件的生命周期1、Struts2中的拦截器层层把Action进行包裹2、整个结构就如同一个堆栈,除了Action以外,堆栈中的其他元素是Interceptor(1)Action位于堆栈的底部由于堆栈“先进后出”的特性,如果试图把Action拿出来执行,必须首先把位于Action 上端的Interceptor拿出来执行。
这样,整个执行就形成了一个递归调用。
(2)每个位于堆栈中的Interceptor,除了需要完成它自身的逻辑,还需要完成一个特殊的执行职责。
这个执行职责有3种选择:1)中止整个执行,直接返回一个字符串作为resultCode2)通过递归调用负责调用堆栈中下一个Interceptor的执行3)如果在堆栈内已经不存在任何的Interceptor,调用Action3、Struts2的拦截器结构的设计,实际上是一个典型的责任链模式的应用首先将整个执行划分成若干相同类型的元素,每个元素具备不同的逻辑责任,并将他们纳入到一个链式的数据结构中(我们可以把堆栈结构也看作是一个递归的链式结构),而每个元素又有责任负责链式结构中下一个元素的执行调用。
这样的设计,从代码重构的角度来看,实际上是将一个复杂的系统,分而治之,从而使得每个部分的逻辑能够高度重用并具备高度可扩展性。
所以,Interceptor结构实在是Struts2/Xwork设计中的精华之笔。
1.1.2应用Struts2中的拦截器技术---自定义拦截器组件1、添加一个拦截器组件类名称为AuthorizedUserInterceptor、包名称为com.px1987.sshwebcrm.interceptor、并且从com.opensymphony.xwork2.interceptor.AbstractInterceptor基类进行继承。
Struts 2的拦截器
Struts 2将它的核心功能放到拦截器中实现而不是集中放在 核心控制器中实现。
拦截器的方法在Action执行之前或者执行之后自动地执行, 从而将通用的操作动态地插入到Action执行的前后,这样有 利于系统的解耦,这种功能的实现类似于我们自己组装的 电脑,变成了可拔插式。
如果有一批拦截器经常固定在一起使用,可以将这些小规 模功能的拦截器定义成为大规模功能的拦截器栈。
<interceptor-ref name="interceptorName|interceptorStackName">
</interceptor-ref>
<引/in用t<e/ri拦cnetp截etroc器resp>t时or-,stSactkr>uts 2并不区分拦截器和拦截器栈,所以
<<在!d-e定-fa定u义l义t-拦默in认t截e的r器c拦e截p栈t器or时引-r用e,f -可n-a>m以e="引int用er其cep他tor的Nam拦e|截int器erc栈ept。orStackName"/>
5
10.1.3 拦截器示例
通过示例代码来讲解拦截器的三个阶段,代码如下所示。
public class MyTimerInterceptor extends AbstractInterceptor{
@Override
public String intercept(ActionInvocation invocation)
</package>
9
10.2.3 自定义拦截器
在Struts 2程序的开发中,如果想要开发自己的拦截器类, 所 有 的 Struts 2 拦 截 器 都 直 接 或 间 接 实 现 接 口 com.opensymphony.xwork2.interceptor.Interceptor 。 该 接 口提供三个方法,方法如下所示:
Struts2拦截器拦截器是Struts2的核心组成部分
}
二、自定义拦截器
2.通过AbstractInterceptor类实现拦截器
前面通过实现Interceptor接口实现了自定义拦截器类的,但是我 们发现就算我们不需要对拦截器的初始化和销毁进行任何操作,也不 得不实现init方法和destroy方法。
这时可以使用另外一个类AbstractInterceptor。该类是一个抽象 类并实现了Interceptor接口,其代码如下所示。 public abstract class AbstractInterceptor implements Interceptor {
3.截器配置拦截器
前面介绍了如何定义拦截器类,但是这时拦截器还不能起作用。 要拦截器其作用则必须在struts.xml文件中配置该拦截器,下面介绍 几种配置拦截器的方法。
1.最简单的配置 2.配置并传递参数 3.配置多个拦截器 4.配置拦截器栈 5.配置拦截器栈并传递参数 6.在拦截器栈中再引入拦截器栈
public void init() {//初始化方法} public void destroy() {//销毁方法} public abstract String intercept(ActionInvocation invocation) throws Exception; //拦截方法 }
二、自定义拦截器
二、自定义拦截器
4.使用拦截器
前面已经介绍了如何配置拦截器,但是现在拦截器还是不能起作 用。因为Action还不知道要使用哪个拦截器,所以还必须在Action元 素中通过添加interceptor-ref节点来指定使用哪个拦截器,代码格式 如下所示。 <action name="业务控制器名" class="业务控制器实现类">
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
理解拦截器
1.1.什么是拦截器:
拦截器,在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。
拦截是AOP的一种实现策略。
在Webwork的中文文档的解释为——拦截器是动态拦截Action调用的对象。
它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行。
同时也是提供了一种可以提取action中可重用的部分的方式。
谈到拦截器,还有一个词大家应该知道——拦截器链(Interceptor Chain,在Struts 2中称为拦截器栈Interceptor Stack)。
拦截器链就是将拦截器按一定的顺序联结成一条链。
在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用。
1.2.拦截器的实现原理:
大部分时候,拦截器方法都是通过代理的方式来调用的。
Struts 2的拦截器实现相对简单。
当请求到达Struts 2的ServletDispatcher时,Struts 2会查找配置文件,并根据其配置实例化相对的拦截器对象,然后串成一个列表(list),最后一个一个地调用列表中的拦截器。
如下图:
2.拦截器的配置
Struts 2已经为您提供丰富多样的,功能齐全的拦截器实现。
大家可以至struts2的jar包内的struts-default.xml查看关于默认的拦截器与拦截器链的配置。
Struts2(XWork)提供的拦截器的功能说明:
3.使用拦截器
一旦定义了拦截器和拦截器栈后,就可以使用这个拦截器或拦截器栈来拦截
栈将会失去作用。
为了继续使用默认拦截器,所以上面配置文件中手动引入了默认拦截器。
4.自定义拦截器
作为“框架(framework)”,可扩展性是不可或缺的。
虽然,Struts 2为我们提供如此丰富的拦截器实现,但是这并不意味我们失去创建自定义拦截器的能力,恰恰相反,在Struts 2自定义拦截器是相当容易的一件事。
4.1.实现拦截器类:
所有的Struts 2的拦截器都直接或间接实现接口
com.opensymphony.xwork2.interceptor.Interceptor。
该接口提供了三个方法:
1)void init(); 在该拦截器被初始化之后,在该拦截器执行拦截之前,
系统回调该方法。
对于每个拦截器而言,此方法只执行一次。
2)void destroy();该方法跟init()方法对应。
在拦截器实例被销毁之前,
系统将回调该方法。
3)String intercept(ActionInvocation invocation) throws Exception;
该方法是用户需要实现的拦截动作。
该方法会返回一个字符串作为逻辑
视图。
除此之外,继承类com.opensymphony.xwork2.interceptor.AbstractInterceptor
是更简单的一种实现拦截器类的方式,因为此类提供了init()和destroy()方法的空实现,这样我们只需要实现intercept方法。
4.2.使用自定义拦截器:
两个步骤:
l通过<interceptor …>元素来定义拦截器。
l通过<interceptor-ref …>元素来使用拦截器。
5.自定义拦截器示例
5.1.问题描述:
使用自定义拦截器来完成用户权限的控制:当浏览者需要请求执行某个操作时,应用需要先检查浏览者是否登录,以及是否有足够的权限来执行该操作。
5.2.实现权限控制拦截器类:
5.3.配置权限控制拦截器:
5.4.运行调试:
在浏览器地址栏直接输入
http://localhost:8080/AuthorityInterceptorDemo/listall.action来访问,此动作配置了权限拦截器,所有被转到登录页面。
登录后:
再访问http://localhost:8080/AuthorityInterceptorDemo/listall.action这个链接:
如果为了简化struts.xml文件的配置,避免在每个Action重复配置该拦截器,可
截器栈。
对于那些不想使用些拦截器栈的action,则应该将它放置在其它的包下。