我开始对拦截器的整个拦截流程很难理解,网上都是解释拦截器里面套拦截器,但是没有将讲拦截器的具体流程,下面通过一个图来讲解一下具体流程,如下图:
可以看到其实拦截器就是和servlet中的filter的类似的,都是在请求方法Action之前先验证一下,这就是拦截器的一种典型的应用,验证用户是否登陆,我们通常会对所有的请求都添加拦截器(方法:修改默认的拦截器,自定义自己的myDefaultInterceptorStack),将所有的请求都通过拦截器,但是请注意:本身是登陆的页面不需要经过拦截器
具体看如下代码:
package com.shengsiyuan.interceptor;
import java.util.Map;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
import com.shengsiyuan.struts2.LoginAction;
public class LoginInterceptor extends AbstractInterceptor {
@Override
public String intercept(ActionInvocation invocation) throws Exception {
if(LoginAction.class==invocation.getAction().getClass()){//要将本身就是登录界面的action排除在interceptor之外,不然无论如何也是转向错误界面Aciton.LOGIN到error.jsp
return invocation.invoke();
}
// TODO Auto-generated method stub
Map map= invocation.getInvocationContext().getSession();
if(null==map.get("userinfo")){
return Action.LOGIN;//除了登录的action,其他action都要加上拦截器
}
return null;
}
}