struts2的拦截器实现细颗粒度权限控制_第1页
struts2的拦截器实现细颗粒度权限控制_第2页
struts2的拦截器实现细颗粒度权限控制_第3页
struts2的拦截器实现细颗粒度权限控制_第4页
struts2的拦截器实现细颗粒度权限控制_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Struts2器实现细颗粒权限控制1:在util 包下创建注解的类AnnoionLimit,用来控制在 Action 类中的方法例如:在Action 的方法上定义:AnnoionLimit(mid=an,=am)2:在util 包下创建器ErrorAndLimiterceptor,代码如下:package cn.elec.util;import java.lang.reflect.Method; import java.util.Hashtable; import java.util.Iterator; import java.util.List;import java.util.Mntry;

2、import javax.servlet.http.HttpServletRequest;importmons.logging.Log;importmons.logging.LogFactory;import.apache.struts2.StrutsSics;import.springframework.web.context.WebApplicationContext;import.springframework.web.context.support.WebApplicationContextUtils;import cn.elec.ElecRolePopedom;import cn.e

3、lec.ElecUser;import cn.elec.service.IElecRoleService;import com.opensymphony.xwork2.ActionInvocation;package cn.elec.util;import java.lang.annoion.Retention; import java.lang.anno ion.RetentionPolicy;/* 自定义注解*/被这个注解修饰的注解,利用反射,将其他的注解出来Retention(RetentionPolicy.RUNTIME) public erface AnnoionLimit Stri

4、ng mid();/子模块模块名称 String(); /父模块操作名称import com.opensymphony.xwork2.erceptor.MethodFiltererceptor;SuppressWarnings(serial)public class ErrorAndLimiterceptor extends MethodFiltererceptor public void init() /* 过滤器过滤url(.do和.jsp)器url(.do)*actioninvocation.invoke():调用struts2的Action的方法,并返回String类型的对应的返回值*

5、/public Stringntercept(ActionInvocation actioninvocation) /把自定义错误信息 放置到request中HttpServletRequest request = (HttpServletRequest)actioninvocation.getInvocationContext().get(StrutsStry /获取请求的action对象ics.HTTP_REQUEST);Object action = actioninvocation.getAction();/获取请求的方法的名称String methodName = actioninv

6、ocation.getProxy().getMethod();/获取action中的方法的封装类(action中的方法没有参数)Method method = action.getClass().getMethod(methodName, null);String result = null; / Action的返回值/在完成跳转Action之前完成细颗粒权限控制,控制Action的每个方法/检查注解,是否可以操作权限的URLflag = isCheckLimit(request,method);if(flag)/ 运行被的Action,期间如果发生异常会被catch住result = act

7、ioninvocation.invoke();elserequest.setribute(errorMsg, 对不起!您没限操作此功能!);return errorMsg;return result;catch (Exception e) /*处理异常*/String errorMsg = 出现错误信息,请查看日志!;/通过instanceof判断到底是什么异常类型if (e instanceof RuntimeException) /未知的运行时异常RuntimeException re = (RuntimeException)/re.prStackTrace();errorMsg = re

8、.getMessage().trim();/*发送错误消息到页面*/request.setribute(errorMsg, errorMsg);e;/* log4j*/Log log =日志LogFactory.getLog(actioninvocation.getAction().getClass(); log.error(errorMsg, e);return errorMsg;.end of catch/publicvoid destroy() /*验证细颗粒权限控制*/publicmethod) isCheckLimit(HttpServletRequest request, Meth

9、odif(method = null) return false;/获取当前的登陆用户 ElecUser elecUser =(ElecUser)request.getSes().getribute(globle_user);if(elecUser = null) return false;/获取当前登陆用户的角色(一个用户可以对应多个角色) Hashtable ht =(Hashtable)request.getSes().getribute(globle role); if(ht = null)return false;/处理注解,判断方法上是否存在注解(注解的名称为:Anno/* 例如:

10、ionLimit)* AnnoionLimit(mid=aa, public String home()*/=0)isAnnoionPresent =method.isAnnoionPresent(AnnoionLimit.class);/不存在注解(此时不能操作该方法)if(!isAnnoionPresent)return false;/存在注解(调用注解)Annomethod.getAnnoionLimit limit =ion(AnnoionLimit.class);/获取注解上的值String mid = limit.mid(); /权限子模块名称(); /权限父操作名称String=

11、 limit./*如果登陆用户的角色id+注解上的Anno* 在elec_role_popedom表中存在ionLimit(mid=aa,flag=true,此时可以=0)Action的方法;* 在elec_role_popedom表中不存在flag=false,此时不能Action的方法;*/flag = false;/器中加载spring容器,从而获取Service类,使用Service类查询对应的用户信息WebApplicationContext wac = WebApplicationContextUtils.getWebApplicationContext(request.getSe

12、ssio n().getServletContext();IElecRoleService elecRoleService =(IElecRoleService)wac.getBean(IElecRoleServi/遍历角色IDERVICE_NAME);3:在 ElecRoleService 类下创建新增方法,使用角色 ID,权限 code,父级权限code 作为联合主键查询角色权限表,判断当前用户是否可以该操作。/*使用角色ID,子权限,父权限,查询角色权限表的所有数据*/publicfindRolePopedomByID(String roleID,String mid,String) /

13、组织查询条件String condition = ;List paramsList = new ArrayList();/角色IDif(StringUtils.isNotBl(roleID) condition += and o.roleID = ?; paramsList.add(roleID);/子权限名称if(StringUtils.isNotBl(mid) condition += and o.mid = ?; paramsList.add(mid);/父权限名称if(StringUtils.isNotBl() condition += and o.= ?; paramsList.ad

14、d();Object params = paramsList.toArray();/查询对应的角色权限信息LisecRolePopedom list =if(ht!=null & ht.size()0) for(IteratorEntry ite =ht.entrySet().iterator();ite.hasNext();)Entry entry = ite.next();/获取角色IDString roleID = entry.getKey();flag = elecRoleService.findRolePopedomByID(roleID, mid,);if(flag)break;return flag;4:在struts.xml 中定义自定义器:放置在 package 下5:在Action 的方法上定义:AnnoionLimit(mid=an,=am)public String hom

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论