实验六 利用Struts2实现自定义拦截器
- 格式:docx
- 大小:25.00 KB
- 文档页数:23
Struts2 拦截器详细配置过程1:所有拦截器的超级接口Interceptor ,Action去实现这个接口; Interceptor 它其中有三个方法(init(),destroy() ,interceptor()):Init()方法:在服务器起动的时候加载一次,并且只加载一次;Destroy()方法:当拦截器销毁时执行的方法;Interceptor()方法:其中里边有一个参数invocationpublic String intercept(ActionInvocationinvocation) throws xception {System.out.println("interceptor!!");String result=invocation.invoke();return result;}Invocation.invoke()是如果只有一个拦截器执行完这个方法后,会返回给视图,如果有多个拦截器,它顺序的执行完所有的拦截器,才返回给视图.2:可以在系统初始化中给拦截器指定默认的参数(也包括了定义拦截器方式)如下:在拦截器类中把hello当做属性set/get方式注入到拦截器类中;<interceptors><!-- 先定义拦截器 --><interceptor name="myInterceptor" class="com.zzz.struts2.i nterceptor.MyInterceptor"><!-- 指定系统初始化给拦截器的参数 --><param name="hello">张钊钊</param></interceptor><!-- 加到自己设置的拦截器栈里边去 --><interceptor-stack name="myStack"><interceptor-ref name="myInterceptor"></interceptor-ref><interceptor-ref name="defaultStack"></interceptor-ref></interceptor-stack></interceptors><!-- 改变系统默认的拦截器,改成自己的默认拦截器,并且一个系统只能有一个默认的拦截器,这样这个拦截器栈会默认应用到所有的Action上去 --><default-interceptor-ref name="myStack"></default-interceptor-ref>也可以在使用拦截器的时候给它设置参数:就是在一个action 的reslut下面配置上如下:<action name="register"class="com.zzz.struts2.action.RegisterAction"><result name="success">/success.jsp</result><!-- result 它其中还有一个信息转发类型 type=""记住,如果不转向JSP,转向图表,可以改变type=""值 --><result name="input">/register.jsp</result><interceptor-ref name="myInterceptor"><param name="hello">welcome</param></interceptor-ref><interceptor-ref name="myStack"></interceptor-ref></action>2.拦截器,拦截器栈和默认的拦截器之间的关系1:拦截器和拦截器栈是一个级别的,也就是说一个拦截器栈中包括许多拦截器, 一个拦截器栈中还可以包括许多拦截器栈,配置如下方式: <interceptors><!-- 先定义拦截器 --><interceptor name="myInterceptor" class="com.zzz.struts2.i nterceptor.MyInterceptor"><!-- 指定系统初始化给拦截器的参数 --><param name="hello">张钊钊</param></interceptor><!-- 加到自己设置的拦截器栈里边去 --><interceptor-stack name="myStack"><interceptor-ref name="myInterceptor"></interceptor-ref><interceptor-ref name="defaultStack"></interceptor-ref> </interceptor-stack></interceptors>拦截器的使用:1.先定义;2.在引用使用;<interceptor name="myInterceptor" class="com.zzz.struts2.interceptor. MyInterceptor"><interceptor-ref name="myInterceptor"></interceptor-ref>2:struts2中有一个系统默认的拦截器栈是 defaultStack,如果你手动引用自己的拦截器,系统默认的拦截器栈将不起作用;这样必需手动引入系统的拦截器栈<interceptor-ref name="defaultStack"></interceptor-ref>如果想改变系统默认的拦截器栈,可以这样配置:<default-interceptor-ref name="myStack"></default-interceptor-ref>其中myStack是自己定义的拦截器栈名字;如果拦截器栈中有多个拦截器,在执行action之前的顺序跟配置拦截器的顺序一致,而在action之后执行的顺序是相反的;3:抽象的拦截器类AbstractInterceptor1:Interceptor这个超级拦截器接口,有三方法需要实现,但是如果不想使用init();和destroy()方法,可以去继承这个抽象拦截器类;它的使用跟上边的没有什么区别;4:方法过滤拦截器MethodFilterInterceptor1:上边的拦截器都要是针对整个action的,如果针对某个方法进行拦截可以去继承这个类;它的使用跟上边的使用方法差不多,只是需要要配置它对那个方法进行拦截,方法过滤拦截器最好不要配置到自己设置默认的拦截器栈里边,自己手动配置.<interceptor-ref name="myInterceptor3"><param name="includeMethods">execute</param><param name="excludeMethods">execute</param></interceptor-ref><interceptor-ref name="defaultStack"></interceptor-ref>其中includeMethods ,excludeMethods是固定写法: includeMethods 包含拦截那些方法,多个方法需要用”,”隔开; excludeMehtods是排除拦截的那些方法;5:鉴听器PreResultListener接口1:它的鉴听点在拦截器执行完某个action方法后,在渲染视图之前做一些事情;让某个类去实现这个接口;然后向需要它的拦截器中注册进去如下代码:publicclass MyInterceptor3 extends MethodFilterInterceptor { privatestaticfinallong serialVersionUID = 3756655410194005443L;@Overrideprotected StringdoIntercept(ActionInvocation invocation) throws Exception { //把鉴听器注册到拦截中去;invocation.addPreResultListener(new MyListener());System.out.println("my Interceptor3");String result=arg0.invoke();System.out.println("my interceptor3 finshed!");return result;}}。
拦截器的工作原理如上图,每一个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官方网站)许多的Struts2中的Action需要共享一些共用信息或者是模块,有些Action需要对输入进行验证,另外一些Action 或许需要对文件上传之前做一些逻辑处理,又或者一些Action需要对重复提交进行保护,还有一些Actiion需要在页面显示前,初始化下拉框或一些页面组件。
Struts2框架使用了Interceptor(拦截器)策略使共享这些关心的模块更简单的使用起来。
当需要使用到一些映射到Action的资源时,框架生成了Action对象,但在该Action 被执行前,执法该Action中的方法被另外一个对象拦截了,在Action执行时,可能再次被拦截,我们亲切地称此对象为拦截器。
理解拦截器拦截器能够在一个Action执行前后拦截它。
目前的很多框架的核心实现均是基于拦截器。
(本人说两句,OOP 因为拦截器而显得更为精彩,AOP必将成为下一个核心关注点)。
拦截器可以帮助实现很多公共的内容,其中有重复提交,类型转换,对象初始化,验证,文件上传,页面初始化等等。
由于每个拦截器都可以像热插拔的模块,你可以在你的Action中正确地去使用需要的拦截器。
拦截器可以配置在一个基类的action中,自定义的拦截器可以尽量少或者配合框架中的已有的拦截器。
所以套用句外国人的话说吧,在一个Action执行时,让我们为它再提升一些吧,给Action更大的舞台更强大的力量吧。
如上图所示,Struts2的Action被一个或者多个拦截器围绕,所有的用户请求都会被拦截器所拦截,最后交给Action处理,处理结果以逻辑视图的方式返回给用户,调用的流程由配置文件来实现。
在一些例子中,一个拦截器可以解决像重复提交以及验证失败这样的例子。
当然也可以改变一个Action在执行前的状态。
拦截器可以定义为一个指定执行顺序的链中,在某些情况下,拦截器的顺序非常的重要。
="struts-default">该元素的意思是定义了一个继承于struts-default包的包,那么该包中的所有action均可使用struts-default.xml中定义的拦截器以及拦截器链。
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”>)结合使用。
Struts 2拦截器的研究与应用Struts 2是一个开源的Java Web应用程序框架。
它是MVC(Model-View-Controller)框架的一种实现,它可以帮助开发人员快速构建灵活和可维护的Web应用程序。
Struts 2拦截器是在Web请求的流程中,拦截控制器和Action等结构组件的执行过程中实现自定义处理的一种机制。
Struts 2框架在执行Action前后提供了很多的拦截器(Interceptor),我们可以通过自定义拦截器实现更灵活的处理。
Struts 2拦截器主要作用是处理控制器和Action等结构组件的执行过程。
对于Web应用程序,请求的处理通常会涉及到以下步骤:1. 请求到达服务器并被Servlet容器接收。
2. Servlet容器将请求发送给Struts2框架。
3. Struts2框架使用ActionContext对象包装请求。
4. Struts2框架使用拦截器链来处理请求。
5. 如果所有拦截器都成功运行,就会执行Action。
6. Action返回结果给Struts2框架。
7. Struts2框架呈现结果给客户端。
可以看出,拦截器在Struts2框架中占据着非常重要的位置。
它们可以对Struts2框架的请求流程进行干预和修改,执行一些通用的、与业务逻辑无关的操作,例如权限判断、登录验证、日志记录等。
拦截器的实现在Struts2中,拦截器是在struts.xml中配置的,每个拦截器都有一个名字和一个类名。
下面是一个拦截器的配置例子:```xml<interceptor name="loginInterceptor" class="com.example.LoginInterceptor" />```以上配置中,interceptor标签用于声明一个拦截器,name属性指定拦截器的名字,class属性指定拦截器的实现类。
Struts2拦截器Interceptor的原理与配置实例详解⼀、Struts2拦截器原理:Struts2拦截器的实现原理相对简单,当请求struts2的action时,Struts 2会查找配置⽂件,并根据其配置实例化相对的拦截器对象,然后串成⼀个列表,最后⼀个⼀个地调⽤列表中的拦截器。
⽐如:应⽤要求⽤户登陆,且必须为指定⽤户名才可以查看系统中某个视图资源;否则,系统直接转⼊登陆页⾯。
对于上⾯的需求,可以在每个Action的执⾏实际处理逻辑之前,先执⾏权限检查逻辑,但这种做法不利于代码复⽤。
因为⼤部分Action⾥的权限检查代码都⼤同⼩异,故将这些权限检查的逻辑放在拦截器中进⾏将会更加优雅。
PS:1. Struts2拦截器是在访问某个Action或Action的某个⽅法,字段之前或之后实施拦截,并且Struts2拦截器是可插拔的,拦截器是AOP的⼀种实现.2. 拦截器栈(Interceptor Stack)。
Struts2拦截器栈就是将拦截器按⼀定的顺序联结成⼀条链。
在访问被拦截的⽅法或字段时,Struts2拦截器链中的拦截器就会按其之前定义的顺序被调⽤。
⼆、Struts2 拦截器接⼝实现:Struts2规定⽤户⾃定义拦截器必须实现com.opensymphony.xwork2.interceptor.Interceptor接⼝。
该接⼝声明了3个⽅法,其中,init和destroy⽅法会在程序开始和结束时各执⾏⼀遍,不管使⽤了该拦截器与否,只要在struts.xml中声明了该Struts2拦截器就会被执⾏。
intercept⽅法就是拦截的主体了,每次拦截器⽣效时都会执⾏其中的逻辑。
void init();void destroy();String intercept(ActionInvocation invocation) throws Exception;1:所有拦截器都使⽤接⼝Interceptor ,Action去实现这个接⼝;Init()⽅法:在服务器起动的时候加载⼀次,并且只加载⼀次;Destroy()⽅法:当拦截器销毁时执⾏的⽅法;Interceptor()⽅法:其中⾥边有⼀个参数invocation;public String intercept(ActionInvocation invocation) throws xception {System.out.println("interceptor!!");String result=invocation.invoke();return result;}其中intercept⽅法是拦截器的核⼼⽅法,所有安装的拦截器都会调⽤之个⽅法。