Struts2拦截器的拦截顺序

如果在同一个系统中配置多个拦截器,根据配置拦截器的顺序不同,执行拦截器的顺序也不一样。通常认为,先配置的拦截器,会先获得执行机会,但实际情况不是这样。下面就从实例来分析拦截器的执行顺序。
首先创建一个简单的拦截器类,如代码2.27所示。
代码2.27  拦截器类:DefaultInterceptor.java
package tmq.interceptor;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
public class DefaultInterceptor extends AbstractInterceptor{        //定义DefaultInterceptor类
        private String name;                                                        //定义name属性
        public void setName(String name){                                //name属性的setXXX()方法
                this.name=name;
        }
        public String intercept(ActionInvocation ai) throws Exception {                                                                                                                                                        //实现intercept()方法
                System.out.println(name+"拦截器执行:  登录Action...");
                        String result=ai.invoke();                                        //执行此拦截器的后一个拦截器,或者直接
                                                                                        //执行指定Action的execute()方法
                System.out.println(name+"拦截器执行完毕...");
                return result;
        }
}
上述定义的拦截器需要传入一个参数,用来指定拦截器的一个标识,这个参数可以在使用拦截器时指定。下面定义与配置拦截器,如代码2.28所示。
代码2.28  拦截器配置:struts.xml
<interceptors>                                                                                <!-- 定义拦截器的名字 -->
        <interceptor name="order" class="tmq.interceptor.DefaultInterceptor"/>
</interceptors>
<action name="order" class="tmq.action.OrderAction">                        <!-- 在Action中使用拦截器 -->
        <result name="success">/success.jsp</result>
        <interceptor-ref name="order">                                                <!-- Action中使用拦截器 -->
                <param name="name">拦截器1</param>                        <!-- 向拦截器1传入参数 -->
        </interceptor-ref>
        <interceptor-ref name="order">
                <param name="name">拦截器2</param>                        <!-- 向拦截器2传入参数 -->
        </interceptor-ref>
        <interceptor-ref name="order">
                <param name="name">拦截器3</param>                        <!--向拦截器3传入参数-->
        </interceptor-ref>
        <interceptor-ref name="defaultStack"/>
</action>
另外还要定义Action,将2.4.1节中DefaultAction.java另存为OrderAction.java。从配置代码中可以看出,名为order的Action可以多次使用同一个拦截器,当使用名为order的拦截器重复的拦截该Action时,指定3个标识不同的拦截器(其实是同一个拦截器,只是标识不同),分别为拦截器1、拦截器2和拦截器3。如果对该Action发送请求,控制台输出信息如图2-14所示。

图2-14  拦截器的执行顺序
从上述输出信息可以看出,在execute()方法执行之前,拦截器1先起作用,接着是拦截器2起作用,然后是拦截器3,也就是说,配置在前的拦截器将先起作用;对于在Action方法execute()执行之后,则拦截器的作用顺序相反,也就是说后配置的拦截器将先起作用。

        如果是在拦截方法之前,则配置在前面的拦截器,会先对用户的请求起作用。如果是在拦截方法之后,则配置在后面的拦截器,会先对用户的请求起作用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值