拦截器 Interceptor
java里的拦截器是动态拦截Action调用的对象。它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行,同时也提供了一种可以提取action中可重用部分的方式。在AOP(Aspect-Oriented Programming)中拦截器用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。
自定义拦截器
自定义一个实现Interceptor接口(或者继承自AbstractInterceptor)的类。
在struts.xml中注册上一步中定义的拦截器。
在需要使用的Action中引用上述定义的拦截器,为了方便也可将拦截器定义为默认的拦截器,这样在不加特殊声明的情况下所有的Action都被这个拦截器拦截。
与过滤器的区别
过滤器可以简单理解为“取你所想取”,忽视掉那些你不想要的东西;拦截器可以简单理解为“拒你所想拒”,关心你想要拒绝掉哪些东西,比如一个BBS论坛上拦截掉敏感词汇。
拦截器是基于java反射机制的,而过滤器是基于函数回调的。
过滤器依赖于servlet容器,而拦截器不依赖于servlet容器。
拦截器只对action起作用,而过滤器几乎可以对所有请求起作用。
拦截器可以访问action上下文、值栈里的对象,而过滤器不能。
在action的生命周期里,拦截器可以多起调用,而过滤器只能在容器初始化时调用一次。
关键代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| package com.interceptor;
import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
public class LoginInterceptor extends AbstractInterceptor { public String intercept(ActionInvocation actionInvocation) throws Exception { Object users = actionInvocation.getInvocationContext().getSession().get("users"); String name = actionInvocation.getInvocationContext().getName(); System.out.println(name); if (null != users || "login".equals(name)) return actionInvocation.invoke(); return "login"; } }
|
struts.xml 拦截器配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| <struts> <package name="default" extends="struts-default"> <interceptors> <interceptor name="sessionUser" class="com.interceptor.LoginInterceptor"></interceptor> <interceptor-stack name="LoginFlag"> <interceptor-ref name="sessionUser"/> <interceptor-ref name="defaultStack"/> </interceptor-stack> </interceptors> <default-interceptor-ref name="LoginFlag"/> </package> </struts>
|
其中可以看到有一行配置 <interceptor-ref name="defaultStack"/>
defaultStack该拦截器用于实现数据的传输,如果不写的话会出现数据提取不到