拦截器

计应134  徐雪双

1.拦截器

拦截器(Interceptor)是Struts2框架的核心组成部分,Struts2拦截器是在访问某个Action或Action的某个方法被访问之前,进行拦截然后在之前或之后加入某些操作。拦截器是AOP(面向方面编程)在Struts2框架中的具体实现。

拦截器是动态拦截Action调用的对象。它提供了一种机制,使开发者可以定义一个特定的功能模块,这个模块可在Action执行之前或之后运行,也可在一个Action执行之前阻止Action的执行。同时还提供了一种可以提取Action中可重用部分的方式。

拦截器栈(Interceptor Stack)是将拦截器按一定的顺序联结成一条链。在访问被拦截的方法或字段时,Struts2拦截器链中的拦截器就会按其之前定义的顺序被调用。

Action被拦截器包围,所有的用户请求都会被拦截器拦截,然后交给Action处理,处理结果以逻辑视图的方式返回给用户,而这个调用的执行流程是由Struts2的配置文件(struts.xml)实现的。

2.拦截器的实现原理

大部分时候,拦截器方法都是通过代理的方式来调用的。Struts 2的拦截器实现相对简单。当请求到达Struts 2的Action时,Struts 2会查找配置文件,并根据其配置实例化相对的拦截器对象,然后串成一个列表(list),最后一个一个地调用列表中的拦截器。

拦截器可以是Struts2框架定制的,也可以是用户自定义。

3.拦截器的配置

在struts2.xml文件中定义拦截器只需为拦截器指定一个拦截器名就可以了,拦截器<interceptor…/>元素定义,其格式为:

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

自定义拦截器栈的语法格式如下:

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

  <interceptor-inf name=”拦截器1”/>

  <interceptor-inf name=”拦截器2”/>

……

</interceptor-stack>

自定义拦截器必须事先com.opensymphony.xwork2.interceptor.Interceptor接口,该接口声明了3个方法:

(1)void init()方法:在服务器启动时加载一次,并且只加载一次。

(2)void destroy()方法:当拦截器销毁时执行

(3)String intercept(ActionInvocation invocation) throes Exception;该方法是用户需要实现的拦截动作。该方法会返回一个字符串作为逻辑视图。

Struts2中提供的抽象类是更简单的一种实现拦截器的方式:

public abstract class AbstractInterceptor implements Interceptor;

public abstract class MethodFilterInterceptor extends Abstracterceptor;

其中AbstractInterceptor提供了init()和destroy()的空实现,使用时只需覆盖intercept()方法;而MethodFilterInterceptor则提供了includeMethods和excludeMethods两个属性,用来过滤执行该过滤器的action方法。可以通过param来加入或者排除过滤的方法。

原文地址:https://www.cnblogs.com/xu2shuang97664/p/4571816.html