struts2中的拦截器

转载 2012年03月23日 00:39:28

一、概述strust2中的拦截器
       拦截器是Struts2框架的核心,它主要完成解析请求参数、将请求参数赋值给Action属性、执行数据校验、文件上传等工作。Struts2设计的灵巧性,拦截器起了关键性的作用,当需要扩展Struts2功能时,只需要提供对应拦截器,并将它配置在Struts2容器中即可;如果不需要该功能时,也只需要取消该拦截器的配置即可。   
      Struts2内建了大量的拦截器,这些拦截器以name-class对的形式配置在struts-default. xml文件中,其中name是拦截器的名字,就是以后我们使用该拦截器的唯一标识;class则指定了该拦截器的实现类,如果我们定义的package继承了Struts2的默认struts-default包,则可以自由使用它下面定义的拦截器,否则必须自己定义这些拦截器。struts2中默认的拦截器是defaultStack.
二、自定义拦截器

    自定义拦截器需要特别注意的是不要忘记引入struts2默认的拦截器。为了实现某些操作,我们可以自定义拦截器,自定义拦截器有三种方式定义。分别为实现Interceptor接口,继承抽象类AbstractInterceptor,继承MethodFilterInteceptor类。

方式一,实现Interceptor接口:

准备工作,使用LoginAction构建一个登录环境,当用户登录成功后,将用户信息保存在session中,LoginAction中的关键代码如下所示:

Java代码  收藏代码
  1. public String execute() throws Exception {  
  2.         if (userName.equals("struts2")) {  
  3.             ActionContext.getContext().getSession().put("user", userName);  
  4.             return "loginSuccess";  
  5.         } else {  
  6.             return "loginFailure";  
  7.         }  
  8.     }  

 现在来测试TestAction中的execute()方法,访问的用户是否有权限访问。

TestAction的代码如下所示:

Java代码  收藏代码
  1. public class TestAction {  
  2.   
  3.     private String message;  
  4.       //setter和getter方法  
  5.     public String execute() throws Exception {  
  6.         this.message = "test action execute方法已执行";  
  7.         return "success";  
  8.     }  
  9. }  

 拦截器代码如下所示:

Java代码  收藏代码
  1. import com.opensymphony.xwork2.ActionContext;  
  2. import com.opensymphony.xwork2.ActionInvocation;  
  3. import com.opensymphony.xwork2.interceptor.Interceptor;  
  4.   
  5. public class PermissionInterceptor implements Interceptor {  
  6.   
  7.     private static final long serialVersionUID = -68905663987676273L;  
  8.   
  9.     @Override  
  10.     public void destroy() {  
  11.         System.out.println("拦截器成功销毁!");  
  12.   
  13.     }  
  14.     @Override  
  15.     public void init() {  
  16.         System.out.println("拦截器初始化成功!");  
  17.     }  
  18.   
  19.     @Override  
  20.     public String intercept(ActionInvocation paramActionInvocation)  
  21.             throws Exception {  
  22.         System.out.println("开始拦截");  
  23.         Object user = ActionContext.getContext().getSession().get("user");  
  24.         if (user != null) {  
  25.             String result =  paramActionInvocation.invoke(); // 如果user不为null,代表用户已经登录,则允许执行action中的方法。  
  26.             System.out.println("结束拦截");  
  27.             return result;  
  28.         }  
  29.         ActionContext.getContext().put("message""您没有权限执行该操作!");  
  30.         System.out.println("结束拦截");  
  31.         return "success";  
  32.     }  
  33. }  

 result.jsp页面的代码如下所示:

Html代码  收藏代码
  1. <body>  
  2. ${message }  
  3.  </body>  

 1。为了使用此拦截器,我们必须将此拦截器进行注册,随后再在要使用此拦截器的Action中引用。即首先在<package>中注册,内容如下:

Xml代码  收藏代码
  1. <interceptors>  
  2.     <interceptor name="permission" class="demo.action.PermissionInterceptor" />  
  3. </interceptors>  

 注册完成后,如果我们要在TestAction中使用此拦截器,只需要在<action>中增加如下内容:

Xml代码  收藏代码
  1. <interceptor-ref name="permission"></interceptor-ref>  

但这种简单的配置会导致你自己的拦截器覆盖掉struts2默认的拦截器,也就是struts2默认的众多拦截器都将不再生效。

因为struts2中如文件上传,数据验证,封装请求参数到action等功能都是由系统默认的defaultStack中的拦截器实现的,所以我们定义的拦截器需要引用系统默认的defaultStack,这样应用才可以使用struts2框架提供的众多功能。

最终struts.xml的配置文件如下所示:

Xml代码  收藏代码
  1. <struts>  
  2.     <constant name="struts.multipart.maxSize" value="10701096" />  
  3.     <package name="myDemo" namespace="/demo" extends="struts-default">  
  4.         <interceptors>  
  5.             <interceptor name="permission" class="demo.action.PermissionInterceptor" />  
  6.             <interceptor-stack name="permissionStack">  
  7.                 <interceptor-ref name="defaultStack" /><!-- 必须放置在"permission"的前面,因为定义的顺序就代表了执行的顺序 -->  
  8.                 <interceptor-ref name="permission" />  
  9.             </interceptor-stack>  
  10.         </interceptors>  
  11.         <action name="login" class="demo.login.action.LoginAction">  
  12.             <result name="loginSuccess">/WEB-INF/jsp/success.jsp</result>  
  13.             <result name="loginFailure">/WEB-INF/jsp/failure.jsp</result>  
  14.         </action>  
  15.         <action name="test" class="demo.action.TestAction">  
  16.             <result>/WEB-INF/jsp/result.jsp</result>  
  17.             <interceptor-ref name="permissionStack" />  
  18.         </action>  
  19.     </package>  
  20. </struts>  

 在启动整个应用程序时,控制台会打印出“拦截器初始化成功!”信息。

如果在未访问login.action之前访问test.action,则在resul.jsp页面中会显示"您没有权限执行该操作!"信息,同时控制台打印出了信息:

开始拦截
结束拦截

如果在访问login.action之后访问test.action,则在resul.jsp页面中会显示"test action execute方法已执行 !"信息,同时控制台打印出了信息:

开始拦截
结束拦截

 

实例流程分析:当我们为TestAction配置了拦截器时,并且有客户端请求此Action时,会首先被此拦截器拦住,然后执行System.out.println("开始拦截"),随后我们调用paramActionInvocation.invoke()方法,它会把请求继续传递给下一个拦截器,下一个拦截器也会继续执行相应代码后再调用invoke方法继续传递,直到请求到达最后一个拦截器,它会把请求传递给Action,比如,我们这里只用到了一个拦截器,当它执行完成后,会把请求直接转交到TestAction处理,TestAction处理完成后,它会返回结果给PermissionInterceptor拦截器。

 

    2。如果希望包下的所有action都使用自定义的拦截器,可以通过<default-interceptor-ref name=“permissionStack”/>把拦截器定义为默认拦截器。注意:每个包只能指定一个默认拦截器。另外,一旦我们为该包中的某个action显式指定了某个拦截器,则默认拦截器不会起作用。

如果配置成如下所示,则当你在登录页面点击提交按钮时,在进入login.action时也会执行拦截,控制台会打印出:

开始拦截
结束拦截

但同时会抛出异常信息,你永远也无法登录系统了。

Java代码  收藏代码
  1. <struts>  
  2.     <constant name="struts.multipart.maxSize" value="10701096" />  
  3.     <package name="myDemo" namespace="/demo" extends="struts-default">  
  4.         <interceptors>  
  5.             <interceptor name="permission" class="demo.action.PermissionInterceptor" />  
  6.             <interceptor-stack name="permissionStack">  
  7.                 <interceptor-ref name="defaultStack" /><!-- 必须放置在"permission"的前面,因为定义的顺序就代表了执行的顺序 -->  
  8.                 <interceptor-ref name="permission" />  
  9.             </interceptor-stack>  
  10.         </interceptors>  
  11.         <default-interceptor-ref name="permissionStack"/>  
  12.         <action name="login" class="demo.login.action.LoginAction">  
  13.             <result name="loginSuccess">/WEB-INF/jsp/success.jsp</result>  
  14.             <result name="loginFailure">/WEB-INF/jsp/failure.jsp</result>  
  15.         </action>  
  16.         <action name="test" class="demo.action.TestAction">  
  17.             <result>/WEB-INF/jsp/result.jsp</result>  
  18.         </action>  
  19.     </package>  
  20. </struts>  

Struts2中的拦截器详解

拦截器是什么拦截器是一种可以在让用户在Action执行之前和Result执行之后进行一些功能处理的机制。 拦截器在action执行之前和result执行之后的顺序是相反的,可以看下图: 也就是说执...
  • u010870518
  • u010870518
  • 2015年05月24日 13:40
  • 3722

Struts2默认拦截器解析

使用struts2,拦截器大家经常使用,当然默认情况我们除了自定义的拦截器外,会使用struts2默认的拦截器,那他究竟有哪些默认的拦截器?每个拦截器都是做什么的呢?我们来看下对应的源码,打开对应源码...
  • yang15638191769
  • yang15638191769
  • 2016年03月12日 16:36
  • 958

【Struts2框架】第六节拦截器-拦截器介绍和总结

一.拦截器概念 Strrurs拦截器是可插拔式的拦截器:如果我们要使用某个拦截器,只需要在配置文件中应用该拦截器即可。 Struts拦截器由struts-default.xml,struts.xml...
  • u013517797
  • u013517797
  • 2015年07月27日 16:09
  • 1308

struts2的拦截器有什么用

拦截器是对调用的Action起作用,它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行。同时也是提供了一种可以提取action中可重用...
  • smith789
  • smith789
  • 2012年02月14日 09:04
  • 2266

Struts2-9 modelDriven与paramsPrepareParams拦截器

本部分内容以实现公司员工的增、删、改、查等操作来贯穿始终,以理论分析和实践相结合的方式来揭开modelDriven与paramsPrepareParams拦截器的神秘面纱……...
  • bingbeichen
  • bingbeichen
  • 2017年02月15日 14:55
  • 678

struts2中拦截器的简介与配置使用

拦截器是struts2框架的核心,struts2很多的功能都是构建在拦截器基础之上的,它是动态拦截Action调用的对象,提供了一种机制,使得开发者能够在一个Action前后执行需要的代码,可以在一个...
  • wojiaohuangyu
  • wojiaohuangyu
  • 2016年05月22日 21:36
  • 8099

Struts2上传文件拦截器实现文件上传

Struts2预置了大量的拦截器,见struts-default.xml第122行。 有一部分拦截器是Struts2框架自身用到的,必须引用,这些拦截器打包在basicStack中,我们项目中引...
  • xlinsist
  • xlinsist
  • 2014年12月11日 13:34
  • 772

Struts2拦截器、拦截器栈(Interceptor Stack)、全局拦截器与方法拦截器

Struts2拦截器原理 Struts2拦截器是在访问某个Action或Action的方法之前或之后实施拦截。在请求Struts2的Action时,Struts2会查找配置文件,并根据配置文件实例化...
  • YEN_CSDN
  • YEN_CSDN
  • 2016年08月03日 15:11
  • 4448

Struts2 拦截器的执行顺序(二十九)

1.如果一个系统中配置了多个拦截器,根据拦截器配置的顺序不同,执行拦截器的顺序也不一样。通常认为,先配置的拦截器,会先获得执行的机会,但是实际情况不是这样。execute()方法执行之前,配置在前面的...
  • luobing_csdn
  • luobing_csdn
  • 2017年03月27日 11:00
  • 678

struts2 拦截器和spring AOP拦截器(security3)功能对比?

1、概述 Struts2 简单来说,就是一个拦截器栈 也就是一系列的拦截器。 处理用户的请求,OGNL的使用,表单验证 等都是默认的拦截器在起作用。 而spring的拦截器,主要体现在AOP的事务...
  • my_dream_fly
  • my_dream_fly
  • 2013年03月04日 10:58
  • 5754
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:struts2中的拦截器
举报原因:
原因补充:

(最多只允许输入30个字)