拦截器总结
拦截器是struts2中非常重要的组成部分,是struts2中极为精妙的一笔,struts2中很多功能都是通过这些拦截器实现,如:异常处理,文件上传请求参数赋值,数据校验等这些功能实现都在拦截器中。要深入理解拦截器,理解拦截器的执行流程是关键,这就需要对在拦截器执行过程中涉及的一些重要类要比较了解,尤其是ActionContext、ValueStack、ActionInvocation,这几个类是一直贯穿在struts2整个执行流程当中。只有了解了这些后才能比较好的理解各个拦截器中的代码。
写了这么多篇关于拦截器的文章,因为主要是用于讲解源码的,所以就没有讲如何去自定义一个拦截器,在这最后就举一个自定义拦截器的例子,一个用于判断用户是否登录的拦截器(LoginInterceptor)。下面是该拦截器配置:
<interceptors>
<interceptor name="login" class="com.xtayfjpk.action.LoginInterceptor">
<param name="excludeMethods">loginUI,login</param>
</interceptor>
<interceptor-stack name="defaultStack">
<interceptor-ref name="login"/>
<interceptor-ref name="defaultStack"/>
</interceptor-stack>
</interceptors>
这里为LoginInterceptor配置了一个参数,表示loginUI与login方法不要应用该拦截器,因为该拦截器是用于判断是否登录的,而loginUI与login方法分别是用于显示用户登录界面与处理用户登录操作的,如果这两个方法也进行拦截的话,那用户永远也登录不了了,所以用于显示登录界面和处理用户登录操作的这两个方法是不能进行登录拦截的,所以LoginInterceptor继承自了MethodFilterInterceptor类。上面的配置中新建了一个拦截器栈,但名字也取为了defaultStack,其主要是为了方便在Action的配置中不要去另外指定拦截器栈的名称。
下面是该自定义拦截器源码:
package com.xtayfjpk.action;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;
public class LoginInterceptor extends MethodFilterInterceptor {
private static final long serialVersionUID = 1L;
@Override
protected String doIntercept(ActionInvocation invocation) throws Exception {
//获取session中的user
Object user = invocation.getInvocationContext().getSession().get("com.xtayfjpk.user");
if(null==user) {//如果user为null则表示用户没有登录导航到登录界面
String resultName = "loginUI";
return resultName;
}
//用户登录了则调用下一个拦截器
return invocation.invoke();
}
}
到此所有拦截器都讲解完毕了,基本上对defaultStack中的所有拦截器都进行了详细的讲解,希望能对大家有所帮助。如有错误之处,尽情指正!