实验六 利用Struts2实现自定义拦截器

合集下载

Struts2_拦截器详细配置过程

Struts2_拦截器详细配置过程

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;}}。

struts2_拦截器(Interceptors)

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的拦截器

exception
提供处理异常功能,将异常映射为结果
fileUpload
负责文件上传
I18n
把指定 Locale 信息放入 Session
logger
输出 Action 名称
store
存储或者访问实现 ValidationAware 接口的 Action 类出现的消息、错
误、字段错误等
model-driven
FilterDispatcher
日志拦截器
Action
Result 图 2-2 添加拦截器
对全部高中资料试卷电气设备,在安装过程中以及安装结束后进行高中资料试卷调整试验;通电检查所有设备高中资料电试力卷保相护互装作置用调与试相技互术关,系电,力根保通据护过生高管产中线工资敷艺料设高试技中卷术资配0料不置试仅技卷可术要以是求解指,决机对吊组电顶在气层进设配行备置继进不电行规保空范护载高高与中中带资资负料料荷试试下卷卷高问总中题体资,配料而置试且时卷可,调保需控障要试各在验类最;管大对路限设习度备题内进到来行位确调。保整在机使管组其路高在敷中正设资常过料工程试况中卷下,安与要全过加,度强并工看且作护尽下关可都于能可管地以路缩正高小常中故工资障作料高;试中对卷资于连料继接试电管卷保口破护处坏进理范行高围整中,核资或对料者定试对值卷某,弯些审扁异核度常与固高校定中对盒资图位料纸置试,.卷保编工护写况层复进防杂行腐设自跨备动接与处地装理线置,弯高尤曲中其半资要径料避标试免高卷错等调误,试高要方中求案资技,料术编试交写5、卷底重电保。要气护管设设装线备备置敷4高、调动设中电试作技资气高,术料课中并中3试、件资且包卷管中料拒含试路调试绝线验敷试卷动槽方设技作、案技术,管以术来架及避等系免多统不项启必方动要式方高,案中为;资解对料决整试高套卷中启突语动然文过停电程机气中。课高因件中此中资,管料电壁试力薄卷高、电中接气资口设料不备试严进卷等行保问调护题试装,工置合作调理并试利且技用进术管行,线过要敷关求设运电技行力术高保。中护线资装缆料置敷试做设卷到原技准则术确:指灵在导活分。。线对对盒于于处调差,试动当过保不程护同中装电高置压中高回资中路料资交试料叉卷试时技卷,术调应问试采题技用,术金作是属为指隔调发板试电进人机行员一隔,变开需压处要器理在组;事在同前发一掌生线握内槽图部内纸故,资障强料时电、,回设需路备要须制进同造行时厂外切家部断出电习具源题高高电中中源资资,料料线试试缆卷卷敷试切设验除完报从毕告而,与采要相用进关高行技中检术资查资料和料试检,卷测并主处且要理了保。解护现装场置设。备高中资料试卷布置情况与有关高中资料试卷电气系统接线等情况,然后根据规范与规程规定,制定设备调试高中资料试卷方案。

通过代码实例跟我学Struts2框架从入门到精通——Struts2框架的拦截器组件技术及应用

通过代码实例跟我学Struts2框架从入门到精通——Struts2框架的拦截器组件技术及应用

(2)在struts-default.xml中定义的默认拦默认拦截器timer组件的示例
将在控制台中出现下面的结果
11、应用了用户自定义的拦截器组件后有可能存在的问题
(1)解决的基本方法 不仅引用自定义的拦截器组件,也对默认的 defaultStack进行引用。 (2)请见下面的示例
(4)编程自定义实 现特定功能的拦截 器,只需要实现拦 截器接口 Interceptor
5、Struts 2框架中的各种形式的拦截器的主要作用
6、实现Interceptor接口创建自定义拦截器 (1)Interceptor接口提供有如下的三个方法
(2)使用init方法可以给拦截器类做必要的初始化操作 ( 3 )应用 destroy 方法可以在拦截器被垃圾回收之前调用, 用来回收init方法初始化的资源。 7 、 intercept() 为拦截器的核心方法,实现具体的拦截功 能
(1)Web Filter和Servlet相互配合、协同工作 Servlet 完成业务功能调度、 Filter 实现系统服务;但 Web Filter 依赖 Servlet 容器并由 Servlet 容器进行生命 周期的管理 (2) Struts2中的拦截器独立于Servlet容器 (3)拦截器是用Java中的“动态代理”和“反射”技术实 现的,并由Struts2的运行时系统程序调度和管理。
(3)在struts.xml文件中定义和引用该拦截器组件
(4)测试该拦截器组件
(5)注意拦截器只能拦截对Action的访问,不能防止用户非 法直接访问的*.jsp页面文件 为此,可以应用Filter组件来控制对*.jsp页面的访问。
10、引用Struts 2框架中的默认拦截器
(1)在struts-default.xml中已经配置了Struts 2框架中 的默认拦截器

Struts2的拦截器配置

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>

Struts2拦截器(翻译自Struts2官方网站)

Struts2拦截器(翻译自Struts2官方网站)

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"&gt;该元素的意思是定义了一个继承于struts-default包的包,那么该包中的所有action均可使用struts-default.xml中定义的拦截器以及拦截器链。

strtus2拦截器使用说明

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的核心组成部分

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="业务控制器实现类">

Struts 2拦截器的研究与应用

Struts 2拦截器的研究与应用

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拦截器Interceptor的原理与配置实例详解

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⽅法是拦截器的核⼼⽅法,所有安装的拦截器都会调⽤之个⽅法。

Struts2自定义拦截器

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拦截器机制

详解Struts2拦截器机制Struts2的核⼼在于它复杂的拦截器,⼏乎70%的⼯作都是由拦截器完成的。

⽐如我们之前⽤于将上传的⽂件对应于action实例中的三个属性的fileUpload拦截器,还有⽤于将表单页⾯的http请求参数设置成action中对应的属性的param拦截器等。

总之,在整个Struts框架中拦截器的作⽤是相当⼤的,本篇将从以下⼏点详细介绍下有关Struts拦截器的内容:拦截器在Struts中的作⽤⾃定义拦截器实现类配置拦截器(包含配置默认拦截器)引⽤拦截器配置拦截指定⽅法的拦截器拦截器的拦截顺序⼀、拦截器在Struts中的作⽤在我们的web.xml中,我们配置了⼀个过滤器,实现将所有请求交付StrutsPrepareAndExecuteFilter类。

⼀旦接受到任意action的请求,该类会创建和初始化⼀个ActionProxy实例,它代理了具体的action,在其中我们可以添加任意拦截器在execute⽅法执⾏之前和之后做⼀些额外的操作,最终会调⽤该action实例的execute⽅法,为⽤户返回视图结果字符串,然后系统会根据该视图结果字符串调取相应的视图页⾯。

下图是拦截器和action之间的关系:这是⼀种典型的AOP思想,当我们在Struts.xml中定义⼀个包的时候,⼤部分情况下我们会继承struts-default⽂件,所以虽然我们在⾃⼰的配置⽂件中并没有⼿动配置任何的拦截器,但是我们创建的action却被很多拦截器拦截处理,就是因为struts-default中配置的拦截器⽣效了。

Struts中内建了很多的拦截器,他们⼤多被配置在struts-default⽂件中,详细的内建拦截器的介绍可以参考官⽅API,接下来我们看如何⾃定义⼀个拦截器。

⼆、⾃定义拦截器实现类想要实现⾃⼰的拦截器类只需要实现 com.opensymphony.xwork2.interceptor.Interceptor.Interceptor 接⼝即可,该接⼝中有如下⼏个⽅法:public abstract void destroy();public abstract void init();public abstract String intercept(ActionInvocation paramActionInvocation)throws Exception;init ⽅法在执⾏拦截⽅法之前回调,主要⽤于初始化⼀些资源,destroy 与init ⽅法对应,在拦截器实例被销毁之前回调,主要⽤于释放在init ⽅法中打开的资源。

如何使用Struts2拦截器.

如何使用Struts2拦截器.

Struts 2
1 struts2拦截器
1.1 如何使用struts2拦截器
如何使用struts2拦截器,或者自定义拦截器。

特别注意,在使用拦截器的时候,在Action里面必须最后一定要引用struts2自带的拦截器缺省堆栈defaultStack,如下(这里我是引用了struts2自带的checkbox拦截器):
也可以改为对全局Action设置自己需要的拦截器,如下:
在struts.xml里面定义全局的配置设置
struts-action.xml里面配置Action如下:
你的拦截器可以正常工作了。

struts2自带的配置及其拦截器配置
拦截器的工作原理如上图,每一个Action请求都包装在一系列的拦截器的内部。

拦截器可以在Action执行直线做相似的操作也可以在Action执行直后做回收操作。

每一个Action既可以将操作转交给下面的拦截器,Action也可以直接退出操作返回客户既定的画面。

struts2拦截器--将用户操作日志存入数据库

struts2拦截器--将用户操作日志存入数据库

struts2拦截器--将用户操作日志存入数据库1.建表,如下所示:2.新建OperationLogModel.java,其具有上述属性。

3.自动生成PO4.在struts.xml中配置拦截器:<interceptors><interceptor name="logger" class="com.bfw.crms.log.LogInterceptor" /><interceptor-stack name="myInterceptor"><interceptor-ref name="defaultStack"></interceptor-ref><interceptor-ref name="logger"></interceptor-ref></interceptor-stack></interceptors>5.如下例子中的用户登录和修改密码,要在相应xml文件中加入<interceptor-ref name="myInterceptor" />,即:<!-- 系统登录--><action name="login" class="systemAction" method="login"><result name="login" type="redirect-action">index</result> <!-- redirect-action 是直接转向index.action --><interceptor-ref name="myInterceptor" /></action><!-- 修改密码--><action name="changePassword" class="systemAction" method="changePassword"> <result name="success" type="redirect-action">changePasswordPre</result><interceptor-ref name="myInterceptor" /></action>6.在项目中新建文件夹log,在其下新建类LogInterceptor .java,如下:package com.bfw.crms.log;import java.util.Map;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpSession;import ng.StringUtils;import org.apache.log4j.Logger;import org.apache.struts2.ServletActionContext;import com.bfw.crms.action.BulletinAction;import com.bfw.crms.action.SystemAction;import com.bfw.crms.model.EmployeeModel;import com.bfw.crms.model.OperationLogModel;import com.bfw.crms.po.OperationLog;import com.bfw.crms.util.BeanUtil;import com.bfw.crms.util.DateTimeUtil;import com.ninetowns.framework.dao.ObjectDao;import com.opensymphony.xwork2.Action;import com.opensymphony.xwork2.ActionInvocation;import com.opensymphony.xwork2.interceptor.AbstractInterceptor;@SuppressWarnings("serial")public class LogInterceptor extends AbstractInterceptor{private String logName;private String logContent;protected Logger log = Logger.getLogger(getClass());protected HttpSession getSession(){return getRequest().getSession();}protected HttpServletRequest getRequest(){return ServletActionContext.getRequest();}public void init() {}private ObjectDao objectDao = null;public ObjectDao getObjectDao(){return objectDao;}public void setObjectDao(ObjectDao objectDao){this.objectDao = objectDao;}@Overridepublic String intercept(ActionInvocation ai) throws Exception {Object action= ai.getAction();String method= ai.getProxy().getMethod();try{if(StringUtils.isBlank(method)) method = "method";EmployeeModel sysUser = (EmployeeModel)this.getSession().getAttribute("employee");String userName = "";if(sysUser!=null) userName = sysUser.getName();String currentTime = DateTimeUtil.getDateTime();String logContentHead = "用户"+userName+currentTime;ai.invoke();//执行被拦截actionif (action instanceof BulletinAction) {if(method.equals("save")){logName = "保存部门";logContent = logContentHead +"保存部门:"+ai.getStack().findValue("Name");(logContent);addSysLog(logName,logContent);}if(method.equals("delete")){logName = "删除部门";logContent = logContentHead +"删除"+((String[])(ai.getStack().findValue("flag_id"))).length+"条部门信息";(logContent);addSysLog(logName,logContent);}}if (actioninstanceof SystemAction) {if(method.equals("login")){logName = "登录系统";logContent = logContentHead;(logContent);addSysLog(logName,logContent);}if(method.equals("changePassword")){logName = "修改密码";logContent = logContentHead +"删除1条单位信息";(logContent);addSysLog(logName,logContent);}}}catch(Exception e){e.printStackTrace();}return Action.SUCCESS;}/*** 插入系统日志model2po()* @param logName* @param logContent*/private void addSysLog(String logName,String logContent){OperationLogModel operationModel = new OperationLogModel();OperationLog operationPO = new OperationLog();operationModel.setOperation(logContent);BeanUtil.model2po(operationModel, operationPO);this.getObjectDao().saveObject(operationPO);}}OK。

Struts2文件上传 +自定义拦截器

Struts2文件上传 +自定义拦截器
<input type="file" name="uploadImage"> </form> 第三步:在Action类中添加以下属性,属性红色部分对应于表单中文件字段的名称: public class HelloWorldAction{
private File uploadImage;//得到上传的文件
方法一,通过ServletActionContext.类直接获取: public String rsa() throws Exception{
HttpServletRequest request = ServletActionContext.getRequest(); ServletContext servletContext = ServletActionContext.getServletContext(); request.getSession() HttpServletResponse response = ServletActionContext.getResponse(); return "scope"; } 方法二,实现指定接口,由struts框架运行时注入: public class HelloWorldAction implements ServletRequestAware, ServletResponseAware, ServletContextAware{ private HttpServletRequest request; private ServletContext servletContext; private HttpServletResponse response; public void setServletRequest(HttpServletRequest req) {

软件开发框架(J2EE)Struts 2拦截器实训指导书

软件开发框架(J2EE)Struts 2拦截器实训指导书

《软件开发框架(J2EE)》课程实训(验)项目单编制部门:编制人:审核人: 编制日期: 2015年9月 7日四、评分标准1.操作规范(20%)2.完成使用拦截器检测用户登录程序开发(50%)3.实训报告(30%)《软件开发框架(J2EE)》课程实训(验)项目单编制部门:编制人:审核人: 编制日期: 2015年9月 7日内容(方法、步骤、要求或考核标准)一、实训设备与工具1.PC机(内存512M以上)2.MyEclipse、JDK、Tomcat、Struts 2框架、浏览器二、实训项目描述当我们签收了在网上购买的商品后,可以对该商品的质量、性价比等进行评价。

为了尊重卖家,要求用户在评语中不能出现“人品差”字样。

如果出现该字样,则需要系统实现对文字的过滤,并使用“*”号来代替。

三、实训步骤、方法与要求1 在com.mxl.actions包中创建ContentAction类2 在com.mxl.interceptor包中创建ContentInterceptor类,该类为过滤文字的拦截器类3 在struts.xml文件中配置ContentInterceptor拦截器,并在ContentAction类的配置中使用该拦截器4 在struts.xml文件中配置自定义拦截器类LoginInterceptor,并在配置Action时引用该拦截器5 在WebRoot目录下新建content_send.jsp页面。

该页面用于用户发表评论6 在WebRoot目录下新建content_success.jsp页面,当评论成功后返回该页面7 运行结果1)将Web应用ch3部署到Tomcat服务器上,然后启动Tomcat服务器。

2)打开浏览器,在地址栏输入http://localhost:8080/ch3/content_send.jsp,显示发表评论界面。

3)输入评论人和评论正文信息,单击【立即发表评论】按钮,自定义过滤器对其发表的评论进行文字过滤,使用“*”号替换“人品差”。

实验二 拦截器

实验二 拦截器

STRUTS框架基础(实验二拦截器)1.内容回顾1)struts2工作原理2)struts2拦截器的工作方式3)struts2自定义拦截器的开发和配置2.实验目的1) 理解struts2的工作原理2) 理解struts2拦截器的工作方式3) 掌握Struts2自定义拦截器的开发和配置3.实验任务1) 查看struts2的默认配置文件中有关拦截器的设置2) 配置一个timer拦截器3) 设计一个简单的拦截器4) 简单的权限检查拦截器的开发4. 实验指导4.1 查看Struts2的默认配置文件中有关拦截器的配置部分1)打开struts-default.xml文件查看<package>中<interceptors>有关常见拦截器4.2 配置一个内置timer拦截器到应用中1)功能要求:获取执行某个Action组件所耗费的时间,以便做一个粗略的性能测试.2)由于timer拦截器是框架内置的,所以只需要对某个Action组件的配置中添加<interceptor-ref>即可,比对上讲HelloWorldAction进行耗时记录。

参考配置如下:3)部署应用并启动服务器,请求该Action组件。

4)观察服务器控制台输出:(以下为参考结果,不同机器不一样)分析:为什么两次请求不一样?4.3 设计一个自定义拦截器1) 功能要求:能够拦截struts请求,并打印一些提示信息。

2) 采用集成抽象类AbstractInterceptor的方式设计,参考代码如下:4)配置自定义拦截器:(1)首先使用在<interceptors>中,使用<interceptor>定义该拦截器,其中name属性为拦截器的别名,class属性指定该拦截器的实现类。

部分配置如下:(2)对某个Action组件配置该拦截器,配置参考上节timer拦截器的配置,参考如下:5)部署运行,察看控制台输出,参考结果如下:5. 权限坚持拦截器应用5.1 功能要求:如果请求到某个资源,但该资源需要等录用户才可访问,如果不是登陆用户则转到登录页面要求登录。

Struts2自定义拦截器

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。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
private String name;
private String password;
private boolean role;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
<constant name="struts.enable.SlashesInActionNames" value="true" />
<constant name="struts.action.extension" value="action" />
<package name="default" extends="struts-default">
</action>
<action name="update" class="erAction"
method="update">
<result name="success">update_result.jsp</result>
<result name="login">/Login.jsp</result>
conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/Mg_book", "root", "123456");
return conn;
} catch (Exception e) {
// TODO Auto-generated catch block
<interceptors>
<interceptor name="CheckLoginInterceptor" class=".interceptor.CheckLoginInterceptor"></interceptor>
<interceptor name="CheckRegistInterceptor" class=".interceptor.CheckRegistInterceptor"></interceptor>
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
<init-param>
<interceptor-ref name="defaultStack"/>
<interceptor-ref name="CheckLoginInterceptor"/>
</action>
<action name="show" class=".action.ShowAction">
<result name="success">displayAll.jsp</result>
method="updateInit">
<result name="success">update.jsp</result>
<result name="login">/Login.jsp</result>
<interceptor-ref name="defaultStack"/>
<interceptor-ref name="CheckLoginInterceptor"/>
<result name="error">F_error.jsp</result>
<result name="login">/Login.jsp</result>
<interceptor-ref name="defaultStack"/>
<interceptor-ref name="CheckLoginInterceptor"/>
<param-name>actionPackages</param-name>
<param-value>com.mycompany.myapp.actions</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<result name="error">regist_error.jsp</result>
<interceptor-ref name="defaultStack"/>
<interceptor-ref name="CheckRegistInterceptor"/>
</action>
<action name="updateInit" class="erAction"
import java.sql.DriverManager;
public class DBConn {
public static Connection conn;
public static Connection getConn(){
try {
Class.forName("com.mysql.jdbc.Driver");
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
</web-app>
struts.xml
<?xml vers"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
</action>
</package>
</struts>
Db
create database Mg_book;
use Mg_book;
create table users(
id int auto_increment primary key not null,
name varchar(10) not null,
values("王丫", "1234", true);
Login
package .entity;
import java.io.Serializable;
/**
* @author wdf
*
*/
public class Login implements Serializable{
private Integer id;
1、自定义拦截器,实现对注册页面上的文字信息进行过滤拦截,不允许出现字符集合中{“佛法”,”集会”,”党派”}的文字信息。如出现,则返回到注册页面,重新填写。
2、定义拦截器,实现登录检查。由于在项目开发时,需要对大多数的页面进行登录检查。当没有登录就无法进行操作,并返回到登录页面。为减少代码量利用Struts2中自定义拦截器的功能,实现登录检查。(避免不登录直接访问某个Action)
<url-pattern>/*</url-pattern>
</filter-mapping>
<display-name>WDF_INTERCEPTOR_6</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
return name;
}
public void setName(String name) {
= name;
}
public String getPassword() {
return password;
相关文档
最新文档