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

时间:2022-06-25 12:11:10

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{

	@Override
	public void destroy() {
		System.out.println("@@@@@@@@@@@@@@@@@销毁");
		
	}

	@Override
	public void init() {
		System.out.println("@@@@@@@@@@@@初始化");
		
	}

	@Override
	public 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方法。