在应用权限控制时,可以在需要的时候写上自己的权限控制代码,这是可行的,不过总会产生大量的重复代码。DRY(Don't Repeat Yourself)不要写重复的代码,在调用目标方法之前或之后执行一些逻辑,这通常可以通过代理的方式来实现,Interceptor基于此。
实现一个登录验证的Interceptor:
/** * 权限控制Interceptor * @author Evan * */ public class LoginInterceptor extends AbstractInterceptor { private static final long serialVersionUID = -1044025795657340245L; @Override public String intercept(ActionInvocation actionInvocation) throws Exception { // 获取ActionContext ActionContext actionContext = actionInvocation.getInvocationContext(); // 获取sessionMap Map<String, Object> session = actionContext.getSession(); String user=(String) session.get("user"); //如果用户名存在,且为Evan,程序继续执行,否则跳转到登录页面 if(user != null && user.equals("Evan")){ //继续执行 return actionInvocation.invoke(); } //向HttpServletRequest中添加属性,即request.setAttribute(msg,...) actionContext.put("msg", "please login!"); //返回LOGIN逻辑视图 return Action.LOGIN; } }
struts.xml中的配置:
<package name="struts2Prac" extends="struts-default" namespace="/"> <interceptors> <!-- 定义Interceptor --> <interceptor name="loginInterceptor" class="cn.enjoylife.prac.interceptors.LoginInterceptor"/> <!-- 定义interceptor stack --> <interceptor-stack name="authenticationStack"> <interceptor-ref name="defaultStack"/> <interceptor-ref name="loginInterceptor"/> </interceptor-stack> </interceptors> <!-- 如果没有定义,默认的interceptor stack为defaultStack,如果定义了则应用之 --> <default-interceptor-ref name="authenticationStack"/> <action name="hello" class="cn.enjoylife.prac.action.HelloAction"> <result name="success" >/success.jsp</result> <result name="login" >/login.jsp</result> </action> </package>
如果不想将authenticationStack作为默认的interceptor stack,可以重新定义一个package用于管理其它的action映射;或者直接在action映射中引用struts默认的interceptor stack。