Struts2拦截器

Struts2 拦截器

  Struts2 拦截器在访问某个 Action 方法之前或之后实施拦截, Struts2 拦截器是可插拔的, 拦截器是 AOP 的一种实现.
  拦截器栈(Interceptor Stack): 将拦截器按一定的顺序联结成一条链. 在访问被拦截的方法时, Struts2拦截器链中的拦截器就会按其之前定义的顺序被依次调用
  Interceptor 接口
    每个拦截器都是实现了 com.opensymphony.xwork2.interceptor.Interceptor接口的 Java 类:

            

      init: 该方法将在拦截器被创建后立即被调用, 它在拦截器的生命周期内只被调用一次. 可以在该方法中对相关资源进行必要的初始化
      interecept: 每拦截一个动作请求, 该方法就会被调用一次.
      destroy: 该方法将在拦截器被销毁之前被调用, 它在拦截器的生命周期内也只被调用一次.
    Struts 会依次调用程序员为某个 Action 而注册的每一个拦截器的 interecept 方法.每次调用 interecept 方法时, Struts 会传递一个 ActionInvocation 接口的实例. 
    ActionInvocation: 代表一个给定动作的执行状态, 拦截器可以从该类的对象里获得与该动作相关联的 Action 对象和 Result 对象. 在完成拦截器自己的任务之后, 拦截器将调用 ActionInvocation 对象的 invoke 方法前进到 Action 处理流程的下一个环节.
    还可以调用 ActionInvocation 对象的 addPreResultListener 方法给 ActionInvocation 对象 “挂” 上一个或多个 PreResultListener 监听器. 该监听器对象可以在动作执行完毕之后, 开始执行动作结果之前做些事情
    AbstractInterceptor 类实现了 Interceptor 接口. 并为 init, destroy 提供了一个空白的实现
  

Struts2 自带的拦截器

 

自定义拦截器
  要自定义拦截器需要实现com.opensymphony.xwork2.interceptor.Interceptor接口:

public class PermissionInterceptor implements Interceptor {
  private static final long serialVersionUID = -5178310397732210602L;
  public void destroy() {}
  public void init() {}
  public String intercept(ActionInvocation invocation) throws Exception {
    System.out.println("进入拦截器");    
    if(session里存在用户){
      String result = invocation.invoke();
    }else{
      return “logon”;
    }
    //System.out.println("返回值:"+ result);
    //return result;
  }
}
<package name="itcast" namespace="/test" extends="struts-default">
  <interceptors>
    <interceptor name=“permission" class="cn.yzu.aop.PermissionInterceptor" />
    <interceptor-stack name="permissionStack">
      <interceptor-ref name="defaultStack" />
      <interceptor-ref name=" permission " />
    </interceptor-stack>
  </interceptors>
  <action name="helloworld_*" class="cn.yzu.action.HelloWorldAction" method="{1}">
    <result name="success">/WEB-INF/page/hello.jsp</result>
    <interceptor-ref name="permissionStack"/>
  </action>
</package>

因为struts2中如文件上传,数据验证,封装请求参数到action等功能都是由系统默认的defaultStack中的拦截器实现的,所以我们定义的拦截器需要引用系统默认的defaultStack,这样应用才可以使用struts2框架提供的众多功能。
如果希望包下的所有action都使用自定义的拦截器,可以通过<default-interceptor-ref name=“permissionStack”/>把拦截器定义为默认拦截器。注意:每个包只能指定一个默认拦截器。另外,一旦我们为该包中的某个action显式指定了某个拦截器,则默认拦截器不会起作用。

博文推荐:Struts2拦截器原理以及实例    

posted @ 2016-12-09 00:48  凌晨。。。三点  阅读(341)  评论(0编辑  收藏  举报