struts2拦截器的使用经验

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();
	}

}


 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值