1.在struts.xml文件中配置拦截器:
<interceptors>
<interceptor name="actionCheck" class="com.xh.td.interceptor.ManagerInterceptor" ></interceptor>
<interceptor-stack name="mystack">
<interceptor-ref name="actionCheck" />
<interceptor-ref name="defaultStack" />
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="mystack"/>
其中interceptor标签用于定义用户的自定义拦截器,该拦截器类需要继承AbstractInterceptor类(该类在xwork-core.jar中),
interceptor-stack标签用于定义自己的拦截器栈,在其中可以定义一系列的拦截器,在调用的时候,包含在其中的拦截器会从上到下的一次调用,在拦截器栈的最后最好将defaultStack这个拦截器栈引用上,否则容易出问题。在defaultStack拦截器栈中定义了一系列的struts2中的拦截器,具体的用户可以查看default-struts.xml中的定义。
default-interceptor-ref标签用于定义相应包中的默认拦截器,这个默认拦截器会自动的添加到当前包的所有action中。
2.编写拦截器类:
public class MyIntercer extends AbstractInterceptor {
private static final long serialVersionUID = 1261275586263865975L;
private static final String LOGIN = "login";
private static final String NO_ACTION = "noaction";
@Override
public String intercept(ActionInvocation ai) throws Exception {
Object action = ai.getAction();
if(action instanceof LoginAction)//判断当前action是否是用于登录的actin类,如果是则返回
return ai.invoke();
Map<String,Object> session = ActionContext.getContext().getSession();
if(null == session.get(SessionStatus.IS_LOGIN)){//用户是否登陆
return LOGIN;
}
if(action instanceof UserAction){//判断当前action是否是用于操作用户信息的actin类
if(!UserStatus.SUPER_MANAGER_YES.equals((Integer)session.get(SessionStatus.IS_SUPER_MANAGER))){//是否是超级管理员
return NO_ACTION;
}
}
return ai.invoke();
}
}
在方法intercept中,返回的是视图名。
3.有时候我们可能需要使得一些的action类中的部分方法不被拦截器拦截,这是我们可以通过配置xml文件实现:
<interceptor name="actionCheck" class="com.xh.td.interceptor.ManagerInterceptor" >
<param name="excludeMethods">modifyOwnPassword,find*</param>
</interceptor>
其中excludeMethods属性中就是不被拦截的方法.。还有一个属性includeMethods用于定义需要被拦截的方法。
但要这两个属性起作用那么拦截器必须要继承类MethodFilterInterceptor,这个类是AbstractInterceptor的子类。
public class ManagerInterceptor extends MethodFilterInterceptor {
private static final long serialVersionUID = 1261275586263865975L;
private static final String LOGIN = "login";
@SuppressWarnings("unused")
private static final String ERROR = "error";
private static final String NO_ACTION = "noaction";
@Override
protected String doIntercept(ActionInvocation ai) throws Exception {
Object action = ai.getAction();
if(action instanceof LoginAction)
return ai.invoke();
Map<String,Object> session = ActionContext.getContext().getSession();
if(null == session.get(SessionStatus.IS_LOGIN)){//用户是否登陆
return LOGIN;
}
if(action instanceof UserAction){
if(!UserStatus.SUPER_MANAGER_YES.equals((Integer)session.get(SessionStatus.IS_SUPER_MANAGER))){//是否是超级管理员
return NO_ACTION;
}
}
return ai.invoke();
}
}