使用Struts 拦截namespace进行权限控制
有时候我需要在几个包下都需要进行同一个权限控制。如在购物网站中,我们需要进入个人中心、下订单、评价
商品等等都需要进行登录权限控制,但是这几个模块并不是位于同一个package下。Struts提供的拦截器,我们可以实
现action下拦截,我们虽然可以在每一个package都配置这个拦截器,但是是相当的麻烦。这个时候我们可以利用拦
截器实现拦击package。将需要进行权限控制package放入拦截器中就可以实现了。
首先我们需要在struts.xml下进行拦截器的配置。
<package name="main" extends="struts-default"> <interceptors> <interceptor name="authorizationInterceptor" class="syxh.common.aop.SystemInterceptor"></interceptor> <interceptor-stack name="jwzhptStack"> <interceptor-ref name="defaultStack"></interceptor-ref> <interceptor-ref name="authorizationInterceptor"></interceptor-ref> </interceptor-stack> </interceptors> <default-interceptor-ref name="jwzhptStack" /> <global-results> <result name="loginfailure" type="redirectAction"> <param name="namespace">/index</param> <param name="actionName">index</param> </result> </global-results> <global-exception-mappings> <exception-mapping result="input" exception="*">/login.jsp</exception-mapping> </global-exception-mappings> </package>
上面配置的main ,所以的package都要继承main,即:extends=”main”,否则实现不了。
在struts.xml中,使用了拦截器栈,里面包含两个拦截器,一个是默认的defaultStack,一个是进行权限控制的
authorizationInterceptor。
拦截器实现类:SystemInterceptor.java
public class SystemInterceptor extends AbstractInterceptor{ private static final long serialVersionUID = -1819593755738908387L; private static final String WITHOUT = "/index, /author, /common, /indexzp"; //不需要进行权限控制的namespace public void destroy(){ } public void init(){ } public String intercept(ActionInvocation invocation) throws Exception{ String namespace = invocation.getProxy().getNamespace(); //获取namespace if (WITHOUT.indexOf(namespace) >= 0){ return invocation.invoke(); } Map<?, ?> session = invocation.getInvocationContext().getSession(); UserBean user = (UserBean) session.get("currentUser"); if (user == null){ //没有登录 return "loginfailure"; } return invocation.invoke(); //已登录 } }
上面的拦截器实现类,指定了几个namespace是不需要进行权限控制的,除此之外其他的namespace都要进行
权限控制。
其他package只需要继承main既可实现权限控制。
<package name="user" namespace="/user" extends="main"> <action name="userCenter_*" class="syxh.grzx.action.UserCenterAction" method="{1}"> <result name="updatePasswordUI">/jsp/grzx/updatePassword.jsp</result> <result name="updateError">/jsp/grzx/updatePassword.jsp</result> <result name="updateSuccess" type="redirect">/zp/myWorksHome.action</result> <result name="updatePhoteUI">/jsp/grzx/updatePhoto.jsp</result> <result name="updateInfoUI">/jsp/grzx/updateInfo.jsp</result> </action> </package>
注:由于这个拦截器主要是根据namespace来进行控制的,所以在配置package,要添加namespace。