在应用权限控制时,可以在需要的时候写上自己的权限控制代码,这是可行的,不过总会产生大量的重复代码。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。