Struts2拦截器(Interceptor)

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)提供的拦截器的功能说明:
Struts2 XWork )提供的拦截器的功能说明:
拦截器
名字
说明
Alias Interceptor
alias
在不同请求之间将请求参数在不同名字件转换,请求内容不变
Chaining Interceptor
chain
让前一个 Action 的属性可以被后一个 Action 访问,现在和 chain 类型的 result <result type=”chain”> )结合使用。
Checkbox Interceptor
checkbox
添加了 checkbox 自动处理代码,将没有选中的 checkbox 的内容设定为 false ,而 html 默认情况下不提交没有选中的 checkbox
Cookies Interceptor
cookies
使用配置的 name,value 来是指 cookies
Conversion Error Interceptor
conversionError
将错误从 ActionContext 中添加到 Action 的属性字段中。
Create Session Interceptor
createSession
自动的创建 HttpSession ,用来为需要使用到 HttpSession 的拦截器服务。
Debugging Interceptor
debugging
提供不同的调试用的页面来展现内部的数据状况。
Execute and Wait Interceptor
execAndWait
在后台执行 Action ,同时将用户带到一个中间的等待页面。
Exception Interceptor
exception
将异常定位到一个画面
File Upload Interceptor
fileUpload
提供文件上传功能
I18n Interceptor
i18n
记录用户选择的 locale
Logger Interceptor
logger
输出 Action 的名字
Message Store Interceptor
store
存储或者访问实现 ValidationAware 接口的 Action 类出现的消息,错误,字段错误等。
Model Driven Interceptor
model-driven
如果一个类实现了 ModelDriven ,将 getModel 得到的结果放在 Value Stack 中。
Scoped Model Driven
scoped-model-driven
如果一个 Action 实现了 ScopedModelDriven ,则这个拦截器会从相应的 Scope 中取出 model 调用 Action setModel 方法将其放入 Action 内部。
Parameters Interceptor
params
将请求中的参数设置到 Action 中去。
Prepare Interceptor
prepare
如果 Acton 实现了 Preparable ,则该拦截器调用 Action 类的 prepare 方法。
Scope Interceptor
scope
Action 状态存入 session application 的简单方法。
Servlet Config Interceptor
servletConfig
提供访问 HttpServletRequest HttpServletResponse 的方法,以 Map 的方式访问。
Static Parameters Interceptor
staticParams
struts.xml 文件中将 <action> 中的 <param> 中的内容设置到对应的 Action 中。
Roles Interceptor
roles
确定用户是否具有 JAAS 指定的 Role ,否则不予执行。
Timer Interceptor
timer
输出 Action 执行的时间
Token Interceptor
token
通过 Token 来避免双击
Token Session Interceptor
tokenSession
Token Interceptor 一样,不过双击的时候把请求的数据存储在 Session
Validation Interceptor
validation
使用 action-validation.xml 文件中定义的内容校验提交的数据。
Workflow Interceptor
workflow
调用 Action validate 方法,一旦有错误返回,重新定位到 INPUT 画面
Parameter Filter Interceptor
N/A
从参数列表中删除不必要的参数
Profiling Interceptor
profiling
通过参数激活 profile
       struts.xml 文件中定义拦截器,拦截器栈
< package name= "my" extends= "struts-default" namespace= "/manage">

                <interceptors>

                <!-- 定义拦截器 -->

                <interceptor name= "拦截器名" class= "拦截器实现类"/>

                <!-- 定义拦截器栈 -->

                <interceptor-stack name= "拦截器栈名">

                         <interceptor-ref name= "拦截器一"/>

                         <interceptor-ref name= "拦截器二"/>

                </interceptor-stack>

                </interceptors>

                ......

</ package>
3.    使用拦截器
一旦定义了拦截器和拦截器栈后,就可以使用这个拦截器或拦截器栈来拦截Action了。拦截器的拦截行为将会在Action的exceute方法执行之前被执行。
<action name="userOpt" class="org.qiujy.web.struts2.action.UserAction">
            <result name="success">/success.jsp</result>
            <result name="error">/error.jsp</result>
<!-- 使用拦截器,一般配置在result之后, -->
<!-- 引用系统默认的拦截器 -->
<interceptor-ref name="defaultStack"/>
            <interceptor-ref name="拦截器名或拦截器栈名"/>
</action>
此处需要注意的是, 如果为Action指定了一个拦截器,则系统默认的拦截器栈将会失去作用。为了继续使用默认拦截器,所以上面配置文件中手动引入了默认拦截器。
4.    自定义拦截器
 
4.1.    实现拦截器类:
所有的Struts 2的拦截器都直接或间接实现接口com.opensymphony.xwork2.interceptor.Interceptor。该接口提供了三个方法:
1)      void init(); 在该拦截器被初始化之后,在该拦截器执行拦截之前,系统回调该方法。对于每个拦截器而言,此方法只执行一次。
2)      void destroy();该方法跟init()方法对应。在拦截器实例被销毁之前,系统将回调该方法。
3)      String intercept(ActionInvocation invocation) throws Exception; 该方法是用户需要实现的拦截动作。该方法会返回一个字符串作为逻辑视图。
除此之外, 继承类com.opensymphony.xwork2.interceptor.AbstractInterceptor是更简单的一种实现拦截器类的方式,因为此类提供了init()和destroy()方法的空实现,这样我们只需要实现intercept方法。

4.2.    使用自定义拦截器:
自定义方法有二种:
方法一:继承抽象截器(AbstractInterceptor)
方法二:继承方法过滤拦截器(MethodFilterInterceptor)
方法一:
继承抽象截器(AbstractInterceptor) :
 <interceptors>
          <interceptor name="mySimple" class="com.cjm.SimpleInterceptor"/>
 </interceptors>
     <action name="login" class="com.cjm.LoginAction">
          <result name="success">main.jsp</result>
          <interceptor-ref name="defaultStack"/>
          <interceptor-ref name="mySimple"/>
     </action>
     注意:一旦我们为Action显式指定了某个拦截器,则默认的拦截器就不再起作用,如果该Action需要使用默认拦截器,则必须手动配置该拦截器的引用。
 
 public class SimpleInterceptor extends AbstractInterceptor{ 
     public String intercept(ActionInvocation invocation)throws Exception{ 
         //取得被拦截的Action实例 
         LoginAction action = (LoginAction) invocation.getAction(); 
           
         //判断是否还有下一个拦截器,有就执行下一个拦截器,没有则开始执行被拦截的类
         String result = invocation.invoke(); 
 
       Map session = invocation.getInvocationContext().getSession();
        String userName = (String) session.get("userName");
        if (null != userName && userName.equals("test")) {
            System.out.println("拦截器:合法用户登录---");
            return invocation.invoke();
        } else {
            System.out.println("拦截器:用户未登录---");
            return Action.LOGIN;
        }
   
         //返回逻辑视图名 
         return result; 
     } 
 }

方法二:
继承方法过滤拦截器(MethodFilterInterceptor)
Struts2提供MethodFilterInterceptor类,该类是AbstractInerceptor的子类,可以实现对Action方
法的拦截. 
MethodFilterInterceptor中有两个方法 :  
setExcludeMethods:排除需要过滤的方法(这里的方法,是指相应的Action中的方法);
setIncludeMethods:设置需要过滤的方法;     
如果一个方法同时在excludeMethods和includeMethods中出现,则会被拦截.
Xml代码:
   1. <interceptors> 
   2. <interceptor name="myFilter" class="com.cjm.MyFilterInterceptor"/> 
   3. </interceptors> 
   4.  
   5.  
   6. <action name="login" class="com.cjm.LoginAction"> 
   7.     <result name="success">main.jsp</result> 
   8.  
   9.     <interceptor-ref name="defaultStack"/> 
  10.     <interceptor-ref name="myFilter"> 
          //也可将参数放于拦截器的定义中.
  11.         <param name="name">属性值</param> 
  12.         <param name="excludeMethods">execute,view,edit</param> 
  13.         <param name="includeMethods">add,list</param> 
  14.     </interceptor-ref> 
  15.  </action> 
JAVA代码:
   1. public class MyFilterInterceptor extends MethodFilterInterceptor{ 
   2.     private String name; 
   3.  
   4.     public void setName(String name){ 
   5.         this.name = name; 
   6.     } 
   7.  
   8.     public String doIntercept(ActionInvocation invocation)throws Exception{ 
   9.         LoginAction action = (LoginAction) invocation.getAction(); 
  10.         String result = invocation.invoke(); 
  11.         return result; 
  12.     } 
  13. }
 
覆盖拦截器中特定拦截器的参数
-->可以在调用拦截器时,进行重定义.
     语法: <拦截器名>.<参数名>
   1. <interceptor-ref name="myFilter"> 
   2.     <param name="mySimple.name">新属性值</param> 
   3. </interceptor-ref> 
 

你可能感兴趣的:(职场,休闲)