首页 > 代码库 > 浅谈 Struts2 拦截器

浅谈 Struts2 拦截器

      Struts2框架是基于拦截器实现的,可以对某个Action进行拦截,然后处理一些逻辑。拦截器相当于AOP里面的环绕通知,即在Action方法的执行之前和之后根据需要添加相应的逻辑。事实上,即使struts.xml 没有任何关于拦截器的配置,Struts2也会为我们添加一组默认的拦截器,最常见的是,请求参数自动绑定到Action对应的字段上(default Stack  默认拦截器栈中params拦截器)。

 

Struts2中自定义拦截器的步骤是:

1.定义拦截器类

2.为Action配置自定义的拦截器类


以定义一个检查是否有请求HelloWorldAction的权限为例:

定义拦截器类

Java代码  收藏代码

  1. package com.tom.interceptors;  


  2. import com.opensymphony.xwork2.ActionInvocation;  

  3. import com.opensymphony.xwork2.interceptor.AbstractInterceptor;  

  4. import org.apache.struts2.ServletActionContext;  

  5.   

  6. //继承AbstractInterceptor  

  7. public class PermissionCheckInterceptor extends AbstractInterceptor {  


  8.     @Override  

  9.     public String intercept(ActionInvocation invocation) throws Exception {  

  10.    

  11.        //取permit请求参数,true表示有权限,其它表示没有权限  

  12.         String value = ((String[])invocation.getInvocationContext().getParameters().get("permit"))[0];  

  13.   

  14.         Boolean permit = Boolean.valueOf(value);  

  15.         if (Boolean.TRUE.equals(permit)) {  

  16.             return invocation.invoke(); //调用Action的方法,并返回那个方法对应的结果视图  

  17.         }  

  18.         //在checkResult视图上显示message信息  

  19.         ServletActionContext.getRequest().setAttribute("message""Permission denies");  

  20.         return "checkResult"//结果转到checkResult对应的视图  

  21.     }  

  22.   

  23. }  

 

 

定义HelloWorldAction

 

 

Java代码  收藏代码

  1. package com.tom.actions;  

  2.   

  3. public class HelloWorldAction {  

  4.     private String permit; //页面上输出permit的值  

  5.     private String message;  

  6.   

  7.     public String getMessage() {  

  8.         return message;  

  9.     }  

  10.   

  11.     public void setMessage(String message) {  

  12.         this.message = message;  

  13.     }  

  14.   

  15.     public String execute() {  

  16.         this.message = "Permission OK, the permit  value is: " + permit;  

  17.         return "checkResult";  

  18.     }  

  19.   

  20.     public String getPermit() {  

  21.         return permit;  

  22.     }  

  23.   

  24.     public void setPermit(String permit) {  

  25.         this.permit = permit;  

  26.     }  

  27. }  

 

 

配置struts.xml

 

 

Xml代码  收藏代码

  1. <!DOCTYPE struts PUBLIC  

  2.         "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"  

  3.         "http://struts.apache.org/dtds/struts-2.3.dtd">  

  4. <struts>  

  5.     <package name="hellopkg" namespace="/hellons" extends="struts-default">  

  6.         <!--定义包级别拦截器,供包内action引用-->  

  7.         <interceptors>  

  8.             <interceptor name="permissionCheckInterceptor" class="com.tom.interceptors.PermissionCheckInterceptor"/>  

  9.         </interceptors>  

  10.         <action name="hi" class="com.tom.actions.HelloWorldAction">  

  11.             <!--引用权限检查拦截器,可以定义多个-->  

  12.             <interceptor-ref name="permissionCheckInterceptor"/>  

  13.             <result name="checkResult">/htmls/checkResult.jsp</result>  

  14.         </action>  

  15.     </package>  

  16. </struts>  

 

 

定义checkResult.jsp

Html代码  收藏代码

  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>  

  2. <html>  

  3. <head>  

  4.     <title></title>  

  5. </head>  

  6. <body>  

  7.     Check Result: ${message}  

  8. </body>  

  9. </html>  

 

访问:

1. http://localhost:8080/hellons/hi?permit=false

页面显示:Check Result: Permission denies

 

2. http://localhost:8080/hellons/hi?permit=true

页面显示:Check Result: Permission OK, the permit value isnull

 

问题:

 在访问http://localhost:8080/hellons/hi?permit=true时,结果显示permit的值为null,而根据Struts2的请求参数与Action字段的对应关系,value的值应该为true才对。这里为null表示Struts2并没有完成请求参数与action字段的自动绑定,原因是,当我们配置HelloWorldAction的拦截器时,把Struts2默认配置到Action中的拦截器覆盖了,这其中就包括参数绑定拦截器

 

 问题解决

Struts2在配置拦截器时,采用的是一种递归的数据结构,拦截器栈interceptor-stack可以包含一组interceptor-ref也可以包含interceptor-stack。

Struts2为每个Action默认配置的一组拦截器放置于名称为defaultStack的拦截器栈中。所以,当为Action配置拦截器时,需要把默认拦截器配置上,并且默认拦截器应该在最前,因为默认拦截器包含了Struts基础和核心功能,应该让这些拦截器优先执行。

 

修改后的struts2.xml

 

Xml代码  收藏代码

  1. <!DOCTYPE struts PUBLIC  

  2.         "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"  

  3.         "http://struts.apache.org/dtds/struts-2.3.dtd">  

  4. <struts>  

  5.     <package name="hellopkg" namespace="/hellons" extends="struts-default">  

  6.         <!--定义包级别拦截器,供包内action引用-->  

  7.         <interceptors>  

  8.             <interceptor name="permissionCheckInterceptor" class="com.tom.interceptors.PermissionCheckInterceptor"/>  

  9.         </interceptors>  

  10.         <action name="hi" class="com.tom.actions.HelloWorldAction">  

  11.             <!--配置默认拦截器-->  

  12.             <interceptor-ref name="defaultStack"/>  

  13.             <!--引用权限检查拦截器,可以定义多个-->  

  14.             <interceptor-ref name="permissionCheckInterceptor"/>  

  15.             <result name="checkResult">/htmls/checkResult.jsp</result>  

  16.         </action>  

  17.     </package>  

  18. </struts>  

 此时访问http://localhost:8080/hellons/hi?permit=true,页面显示Check Result: Permission OK, the permit value is: true

 

 拦截器的其它配置方式

 1.定义并引用拦截器栈

Xml代码  收藏代码

  1. <!DOCTYPE struts PUBLIC  

  2.         "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"  

  3.         "http://struts.apache.org/dtds/struts-2.3.dtd">  

  4. <struts>  

  5.     <package name="hellopkg" namespace="/hellons" extends="struts-default">  

  6.         <!--定义包级别拦截器,供包内action引用-->  

  7.         <interceptors>  

  8.             <!--自定义拦截器-->  

  9.             <interceptor name="permissionCheckInterceptor" class="com.tom.interceptors.PermissionCheckInterceptor"/>  

  10.               

  11.             <!--拦截器栈-->  

  12.             <interceptor-stack name="permissionCheckInterceptorStack">  

  13.                 <!---拦截器内部只能引用其它的拦截器(<interceptor-ref name=... ),而不能使用定义拦截器(<interceptor name=... )-->  

  14.                 <!--默认拦截器-->  

  15.                 <interceptor-ref name="defaultStack"/>  

  16.                 <!--自定义拦截器-->  

  17.                 <interceptor-ref name="permissionCheckInterceptor"/>  

  18.             </interceptor-stack>  

  19.   

  20.         </interceptors>  

  21.         <action name="hi" class="com.tom.actions.HelloWorldAction">  

  22.             <!--拦截器栈包含默认拦截器和自定义拦截器-->  

  23.             <interceptor-ref name="permissionCheckInterceptorStack"/>  

  24.             <result name="checkResult">/htmls/checkResult.jsp</result>  

  25.         </action>  

  26.     </package>  

  27. </struts>  

 

 2.定义默认拦截器

 

Xml代码  收藏代码

  1. <!DOCTYPE struts PUBLIC  

  2.         "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"  

  3.         "http://struts.apache.org/dtds/struts-2.3.dtd">  

  4. <struts>  

  5.     <package name="hellopkg" namespace="/hellons" extends="struts-default">  

  6.         <!--定义包级别拦截器,供包内action引用-->  

  7.         <interceptors>  

  8.             <!--自定义拦截器-->  

  9.             <interceptor name="permissionCheckInterceptor" class="com.tom.interceptors.PermissionCheckInterceptor"/>  

  10.   

  11.             <!--拦截器栈-->  

  12.             <interceptor-stack name="permissionCheckInterceptorStack">  

  13.                 <!---拦截器内部只能引用其它的拦截器(<interceptor-ref name=... ),而不能使用定义拦截器(<interceptor name=... )-->  

  14.                 <!--默认拦截器-->  

  15.                 <interceptor-ref name="defaultStack"/>  

  16.                 <!--自定义拦截器-->  

  17.                 <interceptor-ref name="permissionCheckInterceptor"/>  

  18.             </interceptor-stack>  

  19.   

  20.         </interceptors>  

  21.         <default-interceptor-ref name="permissionCheckInterceptorStack"/>  

  22.         <action name="hi" class="com.tom.actions.HelloWorldAction">  

  23.             <!--不配置拦截器,则如果包内有default-interceptor-ref定义的拦截器,则使用之。default-interceptor-ref定义的拦截器必须包含defaultStack拦截器栈-->  

  24.             <!--如果配置了拦截器,则default-interceptor-ref定义的拦截器不生效,defaultStack定义的拦截器也不生效-->  

  25.             <result name="checkResult">/htmls/checkResult.jsp</result>  

  26.         </action>  

  27.     </package>  

  28. </struts>  




浅谈 Struts2 拦截器