这个是过滤器的升级版,也是struts2中提供的最为强大的功能之一.
运行过程也是有web.xml触发,然后进入struts.xml中,分成了俩种,一种是执行默认的额拦截器,一种是执行用户自定义的过滤器和默认拦截器.然后action接受请求,并且返回响应,然后倒叙执行拦截器,最后返回页面.
默认拦截器的功能有:
工具类拦截器:
timer:记录ActionInvocation余下部分执行的时间,并且作为日志记录输出.
logger:在日志信息中输出哟啊执行的action信息.
属性拦截器:
params:收集请求中的函数.
static-params:把struts.xml中配置文件里定义的action参数,设置到对应的action实例中.
component:为action提供ioc框架的支持,为action设置他所以来的组件实例.
chain:讲前一个执行结束的action属性设置到当前的action中,他被使用在resultType中,分发到下一个action中.
conversionError:欧诺个来处理框架进行类型转化,所报出的错误信息,可以把错误栈显示出来.
servlet-config:提供action直接对servlet api的访问.
fileUpload:文件上传下载.
工作流拦截器:
workflow: workfol默认的工作流,如果action实现了validateable接口,那么interceptor会调用action的validate方法;如果validationAware接口,那么interceptor会使用hasEoor()检测是否包含错误信息,如果包含错误信息,那么会报出input错误,那么在struts.xml中配置.
validation:调用验证框架读取*-validation.xml文件.
自定义interceptor:
首先记住一个原则:interceptor必须是无状态的,并且不能够使用任何ActionInvocation提供范围以外的API(当然基本的Java的API是可以用的,主要是不能使用业务的API)。
原因在于interceptor实质上是AOP的Advice,所以设计的时候必须要能够满足AOP设计的正交性。无状态的意思就是要保证Interceptor的线程安全性。
//拦截器可以实现interceptor接口,或则继承acstractInterceptor
public class LoginInterceptor extends AbstractInterceptor{
@Override
public String intercept(ActionInvocation invocation) throws Exception {
// TODO Auto-generated method stub
//如果请求时直接到登陆页面的时候,直接放行
System.out.println("---------------");
if(invocation.getAction().getClass().equals(LoginAction.class)){
return invocation.invoke();
}else{
//是否登陆
Map<String,Object> session=invocation.getInvocationContext().getSession();
String value=(String) session.get("login");
if(null!=value&&!"".equals(value)){
return invocation.invoke();
}
return "login";
}
}
}
在struts.xml中的配置:
<interceptors>
<interceptor name="loginInterceptor"
class="com.javakc.dbac.module.login.util.LoginInterceptor">
</interceptor>
<interceptor-stack name="MyStack">
<interceptor-ref name="loginInterceptor"/>
<interceptor-ref name="defaultStack"/>
</interceptor-stack>
</interceptors>