struts2拦截器实现细颗粒度权限控制_第1页
struts2拦截器实现细颗粒度权限控制_第2页
免费预览已结束,剩余4页可下载查看

下载本文档

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

文档简介

1、Struts2拦截器实现细颗粒权限控制1:在util包下创建注解的类AnnotationLimit,用来控制在Action类中的方法例如:在Action的方法上定义:AnnotationLimit(mid=an,pid=am)package cn.itcast.elec.util;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;/* * 自定义注解 */被这个注解修饰的注解,利用反射,将其他的注解读取出来Retention(RetentionPolicy.RUNTIME)publ

2、ic interface AnnotationLimit String mid(); /子模块模块名称String pid(); /父模块操作名称2:在util包下创建拦截器ErrorAndLimitInterceptor,代码如下:package cn.itcast.elec.util;import java.lang.reflect.Method;import java.util.Hashtable;import java.util.Iterator;import java.util.List;import java.util.Map.Entry;import javax.servlet.

3、http.HttpServletRequest;import mons.logging.Log;import mons.logging.LogFactory;import org.apache.struts2.StrutsStatics;import org.springframework.web.context.WebApplicationContext;import org.springframework.web.context.support.WebApplicationContextUtils;import cn.itcast.elec.domain.ElecRolePopedom;i

4、mport cn.itcast.elec.domain.ElecUser;import cn.itcast.elec.service.IElecRoleService;import com.opensymphony.xwork2.ActionInvocation;import erceptor.MethodFilterInterceptor;SuppressWarnings(serial)public class ErrorAndLimitInterceptor extends MethodFilterInterceptor public void init() /* * 过滤器过滤url(.

5、do和.jsp) * 拦截器拦截url(.do) * actioninvocation.invoke():调用struts2的Action的方法,并返回String类型的对应的返回值 */public String doIntercept(ActionInvocation actioninvocation) /把自定义错误信息 放置到request中HttpServletRequest request = (HttpServletRequest) actioninvocation.getInvocationContext().get(StrutsStatics.HTTP_REQUEST);tr

6、y /获取请求的action对象Object action = actioninvocation.getAction();/获取请求的方法的名称String methodName = actioninvocation.getProxy().getMethod();/获取action中的方法的封装类(action中的方法没有参数)Method method = action.getClass().getMethod(methodName, null);String result = null; / Action的返回值 /在完成跳转Action之前完成细颗粒权限控制,控制Action的每个方法/

7、检查注解,是否可以操作权限的URLboolean flag = isCheckLimit(request,method);if(flag)/ 运行被拦截的Action,期间如果发生异常会被catch住 result = actioninvocation.invoke();elserequest.setAttribute(errorMsg, 对不起!您没有权限操作此功能!);return errorMsg;return result; catch (Exception e) /* * 处理异常 */String errorMsg = 出现错误信息,请查看日志!;/通过instanceof判断到底

8、是什么异常类型 if (e instanceof RuntimeException) /未知的运行时异常 RuntimeException re = (RuntimeException) e;/re.printStackTrace();errorMsg = re.getMessage().trim();/* * 发送错误消息到页面 */request.setAttribute(errorMsg, errorMsg);/* * log4j记录日志 */Log log = LogFactory.getLog(actioninvocation.getAction().getClass();log.e

9、rror(errorMsg, e);return errorMsg;/ .end of catch public void destroy() /*验证细颗粒权限控制*/public boolean isCheckLimit(HttpServletRequest request, Method method) if(method = null)return false;/获取当前的登陆用户ElecUser elecUser = (ElecUser)request.getSession().getAttribute(globle_user);if(elecUser = null)return f

10、alse;/获取当前登陆用户的角色(一个用户可以对应多个角色)Hashtable ht = (Hashtable)request.getSession().getAttribute(globle_role);if(ht = null)return false;/处理注解,判断方法上是否存在注解(注解的名称为:AnnotationLimit)/* * 例如: * AnnotationLimit(mid=aa,pid=0) public String home() */boolean isAnnotationPresent = method.isAnnotationPresent(Annotati

11、onLimit.class);/不存在注解(此时不能操作该方法)if(!isAnnotationPresent)return false;/存在注解(调用注解)AnnotationLimit limit = method.getAnnotation(AnnotationLimit.class);/获取注解上的值String mid = limit.mid(); /权限子模块名称String pid = limit.pid(); /权限父操作名称/* * 如果登陆用户的角色id+注解上的AnnotationLimit(mid=aa,pid=0) * * 在elec_role_popedom表中存

12、在 flag=true,此时可以访问Action的方法; * * 在elec_role_popedom表中不存在 flag=false,此时不能访问Action的方法; */boolean flag = false;/拦截器中加载spring容器,从而获取Service类,使用Service类查询对应的用户信息WebApplicationContext wac = WebApplicationContextUtils.getWebApplicationContext(request.getSession().getServletContext();IElecRoleService elecRo

13、leService = (IElecRoleService)wac.getBean(IElecRoleService.SERVICE_NAME);/遍历角色IDif(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, pid);if(flag

14、)break;return flag;3:在ElecRoleService类下创建新增方法,使用角色ID,权限code,父级权限code作为联合主键查询角色权限表,判断当前用户是否可以访问该操作。 /*使用角色ID,子权限编号,父权限编号,查询角色权限表的所有数据*/public boolean findRolePopedomByID(String roleID,String mid,String pid) /组织查询条件String condition = ;List paramsList = new ArrayList();/角色IDif(StringUtils.isNotBlank(ro

15、leID)condition += and o.roleID = ?;paramsList.add(roleID);/子权限名称if(StringUtils.isNotBlank(mid)condition += and o.mid = ?;paramsList.add(mid);/父权限名称if(StringUtils.isNotBlank(pid)condition += and o.pid = ?;paramsList.add(pid);Object params = paramsList.toArray();/查询对应的角色权限信息List list = elecRolePopedomDao.findCollectionByConditionNoPage(condition, params, null);boolean flag = false;if(list!=nul

温馨提示

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

评论

0/150

提交评论