版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第九章:拦截器房栋房栋学习目标拦截器的概念配置拦截器使用拦截器拦截器的概念 拦截器(Interceptor)是动态拦截Action调用的对象,类似于Servlet中的过滤器。在执行Action的业务逻辑处理方法(execute()之前,Struts2会首先执行在struts.xml中引用的拦截器。 拦截器是struts2的一个重要特性。Struts2框架的大多数核心功能都是通过拦截器来实现的,像避免表单重复提交、类型转换、对象组装、验证、文件上传等,都是在拦截器的帮助下实现的。拦截器之所以称为“拦截器”,是因为它可以在Action执行之前和执行之后拦截调用。 Struts2将它的核心功能放到拦
2、截器中实现,而不是分散到Action中实现,有利于系统的解耦,使得功能的实现类似于个人电脑的组装,变成了可插拔的,需要某个功能就“插入”一个拦截器,不需要某个功能就“拔出”一个拦截器。你可以任意组合拦截器来为Action提供附加的功能,而不需要修改Action的代码。拦截器的工作方式 拦截器围绕着Action和Result的执行而执行,其工作方式如图: 从图中可以看到,在Action和Result执行之前,为Action配置的拦截器将首先被执行,在Action和Result执行之后,拦截器将重新获得控制权,然后按照与先前调用相反的顺序依次执行。在整个执行过程中,任何一个拦截器都可以选择直接返回
3、,从而终止余下的拦截器、Action和Result的执行。例如:当一个未授权的用户访问受保护的资源时,执行身份验证的拦截器可以直接返回。Struts2的数据流图Struts2内置拦截器 Struts2内建了大量的拦截器,这些拦截器以name-class对的形式配置在struts-default.xml文件中,其中name是拦截器的名字,就是以后使用该拦截器的唯一标识;class则指定了该拦截器的实现类,如果我们定义的package继承了Struts2的struts-default包,则可以自由使用下面定义的拦截器,否则必须自己定义这些拦截器。Struts2内置拦截器大部分时候,开发者无需手动控
4、制这些拦截器,因为大部分时候,开发者无需手动控制这些拦截器,因为struts-default.xml文件中已经配置了这文件中已经配置了这些拦截器,只要我们定义的包继承了系统的些拦截器,只要我们定义的包继承了系统的struts-default包,就可以直接使用这些拦截器。包,就可以直接使用这些拦截器。 编写拦截器类 在struts2中要编写拦截器类,必须实现erceptor.Interceptor接口,该接口定义了如下的三个方法: void init(): 该方法在拦截器实例创建后、intercept()方法被调用之前调用,用于初始化拦截器所
5、需要的资源,例如数据库连接的初始化。该方法只执行一次。 void destroy(): 该方法在拦截器实例被销毁之前调用,用于释放在init()方法中分配的资源。该方法只执行一次。 String intercept(ActionInvocation invocation) throws Exception: 该方法在Action执行之前被调用,拦截器为Action提供的附加功能在该方法中实现。利用invocation参数,可以获取action执行的状态。在intercept()方法中,如果要继续执行后续的部分(包括余下的应用于Action的拦截器、Action和Result),可以调用invo
6、cation.invoke()。如果要终止后续的执行,可以直接返回一个结果码,框架将根据这个结果码来呈现对应的结果视图。TimerInterceptor.javaimport com.opensymphony.xwork2.ActionInvocation;import erceptor.Interceptor;public class TimerInterceptor implements Interceptor public void destroy() public void init() public String intercep
7、t(ActionInvocation invocation) throws Exception long startTime = System.currentTimeMillis(); String result = invocation.invoke(); long executionTime = System.currentTimeMillis() - startTime; System.out.println(Action的执行花费的毫秒数是: + executionTime); return result; Struts.xmlindex.jsp说明 这是一个非常简单的拦截器,用于输出
8、Action执行花费的时间。在invocation.invoke()调用的前后,你可以添加自己的逻辑代码。Invocation.invoke()调用之前的代码将在Action执行之前执行,invocation.ivoke()调用之后的代码将在Action执行之后执行。 为了简化拦截器的开发,struts2还提供了一个抽象类: erceptor.AbstractInterceptor 它实现了Interceptor接口,并给出了init()和destroy()方法的空实现。我们编写的拦截器类也可以选择继承AbstractInterceptor
9、类,如果不需要init()和destroy()方法,那么你只需要重写抽象的intercept()方法就可以了。 Struts2还提供了一个特殊的拦截器抽象基类: erceptor.MethodFilterInterceptor 这个拦截器可以指定要拦截或排除的方法列表。通常情况下,拦截器将拦截Action的所有方法调用,但在某些应用场景中,对某些方法的拦截将会出现一些问题。例如:对表单字段进行验证的拦截器,当我们通过doDefault()方法输出表单时,该方法不应该被拦截,因此此时表单字段都没有数据。说明 在struts2中,从Method
10、FilterInterceptor继承的拦截器类有: TokenInterceptor TokenSessionStoreInterceptor DefaultWorkflowInterceptor ExecuteAndWaitInterceptor ValidationInterceptor ParametersInterceptor PrepareInterceptor MethodFilterInterceptor通过指定included/excluded方法列表来选择拦截器或排除的方法,可以设置的参数如下: excludeMethods-要排除的方法。 includeMethods-要
11、拦截的方法。 例如:有如下的拦截器配置:input,back,cancelexecute说明 当执行Action的input、back和cancel方法时,验证拦截器将不执行对输入数据的验证。当执行Action的execute方法时,验证拦截器将执行对输入数据的验证。 在设置拦截器或排除的方法时,如果有多个方法,那么以逗号(,)分隔,如上所示。如果一个方法的名字同时出现在execludeMethods和includeMethods参数中,那么它会被当作要拦截的方法。也就是说, includeMethods优先于execludeMethods。 在编写拦截器类的时候要注意,拦截器必拦截器必须是无
12、状态的,换句话说,在拦截器类中须是无状态的,换句话说,在拦截器类中不应该有实例变量不应该有实例变量。这是因为struts2对每一个体Action的请求使用的是同一个拦截器实例来拦截调用,如果拦截器有状态,在多个线程(客户端的每个请求将由服务器端的一个线程来服务)同时访问一个拦截器实例的情况下,拦截器的状态将不可预测。拦截器栈 在很多时候,指定的拦截器需要被多个Action所使用,这个时候,如果我们为每一个Action都分别配置拦截器的话,不仅麻烦,而且不利后期的维护,此时就需要用到拦截器栈。 所谓拦截器栈就是将一些拦截器组合起来进行统一管理。 拦截器栈的使用与拦截器的使用非常相似,唯一有区别的
13、地方,就是拦截器栈的布署方式。配置拦截器一 在配置拦截器的时候可以为拦截器传递参数,对于已经配置好的拦截器,在引用时还可以覆盖它的参数。 例如,defaultStack拦截栈中的validation拦截器配置如下:input,back,cancel 在Action配置中,我们想要覆盖validation拦截器的excludeMethods参数的设置,可以配置如下:default index.jsp 但这样会有一个问题,这是因为defaultStack拦截器栈包含了validation和workflow拦截器,这两个拦截器都可以有excludeMethods参数,采用上述方式,框架将无法知道你是
14、要为哪一个拦截器传递参数。配置拦截器二 为了覆盖defaultStack拦截器栈中validation拦截器的excludeMethods参数设置,我们可以在Action的配置中直接引用defaultStack拦截器栈中的所有拦截器,然后在引用validation拦截器时,设置参数,如下所示:配置拦截器三 很明显,这种配置太麻烦,也太冗余了。为此,struts2为我们提供了另外一种方式来覆盖拦截器的参数设置,那就是在指定参数名时,加上拦截器名前缀,例如:validation.excludeMethods.采用这种方式,我们仍然可以继续引用defaultStack拦截器栈,如下所示:defaul
15、t index.jsp 这样一来就简洁多了。安全验证拦截器一 login.jsp安全验证拦截器二 欢迎你登录后台系统 success.jsp安全验证拦截器三LoginAction.java安全验证拦截器三 LoginAction继承自ActionSupport类,这是因为我们要利用基类的addActionError()方法来添加用户登录失败的提示信息。LoginAction还实现了SessionAware接口,ServletConfig拦截器将会向LoginAction注入session Map对象。 当用户登录成功后,我们将user对象保存到session中。在我们编写的执行安全验证的拦截器
16、中,可以根据session中是否存在user对象,来判断用户是否登录。安全验证拦截器四 AuthenticationInterceptor拦截器负责判断用户是否已经登录,如果用户已经登录,则继续执行余下的拦截器、Action和Result的调用;否则,返回Action.LOGIN结果代码,将请求重定向到登录页面。 AuthenticationInterceptor类的代码如下:安全验证拦截器五安全验证拦截器五 struts.xml配置配置Action和拦截器和拦截器举例说明 如果一个结果在多个Action或者拦截器中使用,那么就应该将它定义为全局的结果,就像本例的login结果。 resour
17、ce action的配置没有指定类名,因此默认使用com.opensymphony.xwork2.ActionSupport类。由于我们只是利用Action来转发请求,所以简单地使用ActionSupport类就可以了。 注意:只对需要保护的Action设置引用securityStackk拦截器栈;对于LoginAction,本身就是用来登录的, 因此不要对它引用securityStack拦截器栈。 测试与发布: http:/localhost:8080/项目名/resource.action 在登录后,再次访问/resource.action。看看结果。拦截器的高级应用 如何自定义拦截器 指定拦截器作用于某个方法 多个拦截器的执行顺序 拦截器在解决重复提交中的作用如何自定义拦截器 实现Interceptor接口 继承AbstractInterceptor类,此类实现了Interceptor接口 继承MethodFilterInterceptor,可实现方法过滤拦截struts.xml指定拦截器作用于某个方法 需要拦截器作用的方法,使用excludeMethods方法 不需要拦截器作用的方法,使用includeMethods方法struts.xml测试:http:/localhost:8888/testI
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024咨询服务合同范本标准范文
- 广东省珠海市七年级上学期语文期中试卷7套【附答案】
- 2024药品代理合同范本
- 单位团购房产转让合同范本
- 企业财产出售协议样式
- 2024年农村房屋转让协议范本
- 七年级地理上册5.1《世界的人口》教案粤教版
- 2024版标准家庭装修协议
- 建筑外墙保温工程施工合同
- 个人借款合同协议书格式示例
- JC-T 2536-2019水泥-水玻璃灌浆材料
- 品牌授权协议书
- 艺术设计就业职业生涯规划
- 《狙击手》和《新神榜杨戬》电影赏析
- 枪库应急处置预案
- 老年患者术后谵妄的护理干预
- 《凸透镜成像的规律》课件
- 仓库管理中的客户服务和沟通技巧
- 规划选址及用地预审
- 土砂石料厂项目融资计划书
- 2024年给药错误护理不良事件分析持续改进
评论
0/150
提交评论