拦截器的工作原理,自定义拦截器的实现

来源:互联网 发布:python爬取股票数据 编辑:程序博客网 时间:2024/06/05 18:05

struts2的一个优点就是它为我们提供了拦截器。那么拦截器是怎么工作的呢!


这是我自己写的一个拦截器类:

package tm.change.interceptor;import com.opensymphony.xwork2.ActionContext;import com.opensymphony.xwork2.ActionInvocation;import com.opensymphony.xwork2.interceptor.Interceptor;public class LoginInterceptor implements Interceptor{@Overridepublic void destroy() {System.out.println("@@@@@@@@@@@@@@@@@销毁");}@Overridepublic void init() {System.out.println("@@@@@@@@@@@@初始化");}@Overridepublic String intercept(ActionInvocation arg0) throws Exception {String name = (String) ActionContext.getContext().getSession().get("name");if(name!=null&& !name.equals("")){//invoke()方法执行说明拦截结束,否则被拦截arg0.invoke();return "success";}return "login";}}

那拦截器怎么配置呢?

这是struts.xml中的一段代码,注意看注释



<package name="csdn" namespace="/test" extends="struts-default"><interceptors><!-- 定义自己的拦截器loginInterceptor --><interceptor name="loginInterceptor" class="tm.change.interceptor.LoginInterceptor"></interceptor><!-- 定义自己的拦截器栈loginInterceptor --><interceptor-stack name="myStack"><interceptor-ref name="loginInterceptor"/><!-- 自定义类 --><interceptor-ref name="defaultStack"/><!-- struts-default.xml自带的 --></interceptor-stack></interceptors><!-- 将myStack设置为默认的拦截器,就是说如果某个action没有设置拦截器,那就会执行这个拦截器 --><default-interceptor-ref name="myStack"/>


再看下面连个action,上面的action设置了自己的拦截器,所以它执行defaultStack

下面这个action没有设置自己的拦截器,所以它执行默认的拦截器 myStack


<action name="login" class="tm.change.action.UserAction" method = "login"><interceptor-ref name="defaultStack"/><result name = "success">/index.jsp</result></action><action name="index" class="tm.change.action.UserAction" method = "login"><result name = "success">/index.jsp</result></action>


备注:有一点不得不提。那就是,都收到action请求时,都是先执行拦截器,然后再执行action中的method。

执行拦截器的时候,如果执行到 invoke() 方法,接着就执行method方法。如果没有执行invoke()方法,则不执行method方法。





0 0