使用Struts 拦截namespace进行权限控制
有时候我需要在几个包下都需要进行同一个权限控制。如在购物网站中,我们需要进入个人中心、下订单、评价商品等等都需要进行登录权限控制,但是这几个模块并不是位于同一个package下。Struts提供的拦截器,我们可以实现action下拦截,我们虽然可以在每一个package都配置这个拦截器,但是是相当的麻烦。这个时候我们可以利用拦截器实现拦击package。将需要进行权限控制package放入拦截器中就可以实现了。
首先我们需要在struts.xml下进行拦截器的配置。
1 <package name="main" extends="struts-default"> 2 <interceptors> 3 <interceptor name="authorizationInterceptor" class="syxh.common.aop.SystemInterceptor"></interceptor> 4 <interceptor-stack name="jwzhptStack"> 5 <interceptor-ref name="defaultStack"></interceptor-ref> 6 <interceptor-ref name="authorizationInterceptor"></interceptor-ref> 7 </interceptor-stack> 8 </interceptors> 9 10 <default-interceptor-ref name="jwzhptStack" /> 11 12 <global-results> 13 <result name="loginfailure" type="redirectAction"> 14 <param name="namespace">/index</param> 15 <param name="actionName">index</param> 16 </result> 17 </global-results> 18 19 <global-exception-mappings> 20 <exception-mapping result="input" exception="*">/login.jsp</exception-mapping> 21 </global-exception-mappings> 22 </package>
上面配置的main ,所以的package都要继承main,即:extends=”main”,否则实现不了。
在struts.xml中,使用了拦截器栈,里面包含两个拦截器,一个是默认的defaultStack,一个是进行权限控制的authorizationInterceptor。
拦截器实现类:SystemInterceptor.java
1 public class SystemInterceptor extends AbstractInterceptor{ 2 3 private static final long serialVersionUID = -1819593755738908387L; 4 private static final String WITHOUT = "/index, /author, /common, /indexzp"; //不需要进行权限控制的namespace 5 6 public void destroy(){ 7 } 8 9 public void init(){ 10 } 11 12 public String intercept(ActionInvocation invocation) throws Exception{ 13 String namespace = invocation.getProxy().getNamespace(); //获取namespace 14 if (WITHOUT.indexOf(namespace) >= 0){ 15 return invocation.invoke(); 16 } 17 18 Map<?, ?> session = invocation.getInvocationContext().getSession(); 19 UserBean user = (UserBean) session.get("currentUser"); 20 if (user == null){ //没有登录 21 return "loginfailure"; 22 } 23 return invocation.invoke(); //已登录 24 } 25 }
上面的拦截器实现类,指定了几个namespace是不需要进行权限控制的,除此之外其他的namespace都要进行
权限控制。
其他package只需要继承main既可实现权限控制。
1 <package name="user" namespace="/user" extends="main"> 2 <action name="userCenter_*" class="syxh.grzx.action.UserCenterAction" method="{1}"> 3 <result name="updatePasswordUI">/jsp/grzx/updatePassword.jsp</result> 4 <result name="updateError">/jsp/grzx/updatePassword.jsp</result> 5 <result name="updateSuccess" type="redirect">/zp/myWorksHome.action</result> 6 <result name="updatePhoteUI">/jsp/grzx/updatePhoto.jsp</result> 7 <result name="updateInfoUI">/jsp/grzx/updateInfo.jsp</result> 8 </action> 9 </package>
注:由于这个拦截器主要是根据namespace来进行控制的,所以在配置package,要添加namespace。
-
作者:chenssy。一个专注于【死磕 Java】系列创作的男人
出处:https://www.cnblogs.com/chenssy/p/3140018.html
作者个人网站:https://www.cmsblogs.com/。专注于 Java 优质系列文章分享,提供一站式 Java 学习资料
目前死磕系列包括:
1. 【死磕 Java 并发】:https://www.cmsblogs.com/category/1391296887813967872(已完成)
2.【死磕 Spring 之 IOC】:https://www.cmsblogs.com/category/1391374860344758272(已完成)
3.【死磕 Redis】:https://www.cmsblogs.com/category/1391389927996002304(已完成)
4.【死磕 Java 基础】:https://www.cmsblogs.com/category/1411518540095295488
5.【死磕 NIO】:https://www.cmsblogs.com/article/1435620402348036096
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。