笔记:Struts2 拦截器

时间:2023-03-09 16:09:57
笔记:Struts2 拦截器
  • 配置拦截器
    • Struts.xml 配置文件中,使用<interceptor…/>来定义拦截器,有属性 name 表示拦截器的名称,class 表示拦截器的具体首先类,可以使用<param…/>子元素来配置拦截器的参数,配置示例:

      <package name="包名称" extends="抽象包名称">

      <interceptors>

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

      <param name="参数名称">参数值</param>

      </interceptor>

      </interceptors>

      </package>

    • 可以把多个拦截器配置为一个拦截器栈,使用<interceptor-stack…/>来配置拦截器栈,归属于<interceptors…>元素下,有属性name表示拦截器栈的名称,使用<interceptor-ref…/>来引用拦截器,可以使用<param…/>子元素来配置拦截器的参数,配置示例:

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

      <interceptor-ref name="拦截器名称">

      <param name="参数名称">参数值</param>

      </interceptor-ref>

      </interceptor-stack>

      注意:完全可以把拦截器栈当成一个更大的拦截器来处理,因此拦截器栈中,可以引用另一个拦截器栈;如果在<interceptor-ref…/>定义了拦截器参数,则会替换在<interceptor…/>中定义的参数值。

    • Action 要使用拦截器和拦截器栈,可以在<Action../>中增加<interceptor-ref…/>子元素,其配置格式和拦截器栈的配置一样,如果要覆盖拦截器栈的某个拦截器的参数值,则可以使用[拦截器名称].[参数名称]这种形式来传入参数。
    • 可以在包中使用<default-interceptor-ref…/>来定义默认拦截器,如果 Action 没有定义拦截器,则默认拦截器会生效,如果Action显示的定义了拦截器,则包的默认拦截器会不生效,系统默认的拦截器栈名称是 defaultStack,如果显示定义了拦截器还想使用默认的拦截器,则需要显示的定义这个系统拦截器。
  • 自定义拦截器
    • Struts2 中需要开发自己的拦截器类,则需要实现 Interceptor 接口,Struts2 还提供了 AbstractInterceptor 抽象类继承Interceptor接口,实现了空白的 init 和 destroy 方法,Interceptor 接口的声明如下:

      public interface Interceptor extends Serializable {

      void init();

      void destroy();

      String intercept(ActionInvocation invocation) throws Exception;

      }

      • 方法 init:拦截器实例化后,在执行拦截前系统将调用该方法,这个方法只执行一次
      • 方法 destroy:拦截器销毁前,系统将调用该方法,这个方法只执行一次
      • 方法 intercept:该方法是用户需要实现的拦截动作,可以直接返回一个字符串,系统将会跳转到逻辑视图对应的物理视图资源,不会调用被拦截的Action;其参数 ActionInvocation 包含了被拦截的 Action 的引用,可以通过调用该参数 invoke方法,将控制权给下一个拦截器,如果不存在拦截器则会调用被拦截的 Action
  • 方法过滤拦截器
    • 在默认情况下,拦截器会拦截 Action 的所有方法,如果只需要拦截指定方法,此时就需要使用struts2拦截器的方法过滤特性,struts2 提供了一个 MethodFilterInterceptor 类,该类继承于 AbstractInterceptor类,需要重写 doIntercept 方法来对方法进行过滤,提供了二个参数来对方法进行过滤:
      • 参数 excludeMethods:排除的方法,配置了这个参数的方法将不会被拦截器拦截
      • 参数 includeMethods:包含的方法,配置了个参数的方法将被拦截,该参数配置的优先级最高,如果都没有配置参数,则默认是所有方法都包含,都会被拦截
    • Struts2 提供的支持方法过滤的拦截器有:
      • TokenInterceptor:防止表单重复提交的拦截器
      • TokenSessionStroreInterceptor
      • DefaultWorkflowInterceptor
      • ValidationInterceptor

         
         

  • 拦截器执行顺序,在Action的控制方法执行之前,位于拦截器链前面的拦截器将先发送作用;在Action的控制方法执行之后,位于拦截器链前面的拦截器将后发送作用。