付费下载
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026江西南昌市江铃新能源汽车有限公司招聘备考题库含答案详解(考试直接用)
- 2026广西南宁市人力资源和社会保障局招募南宁市本级第一批就业见习人员758人备考题库及参考答案详解1套
- 2026四川绵阳万江眼科医院招聘备考题库及答案详解(考点梳理)
- 2026新疆和田果业有限公司招聘3人备考题库附答案详解(满分必刷)
- 2026广西南宁市兴宁区发展改革和科学技术局外聘人员招聘1人备考题库及完整答案详解一套
- 2026安徽阜阳市太和农商银行春季校园招聘11人备考题库附答案详解(综合卷)
- 2026北京大学光华管理学院招聘劳动合同制人员1人备考题库含答案详解(培优b卷)
- 2026河北石家庄市供热管理集团有限公司招聘25人备考题库附答案详解
- 2026天津市消防救援总队水上支队招录政府专职消防员95人备考题库含答案详解(完整版)
- 2026重庆市万州区龙驹镇人民政府招聘公益性岗位4人备考题库附答案详解(突破训练)
- 特种设备基础知识
- 城镇开发边界局部优化方案编制要求
- 盖房四邻签字协议书范文
- 2024展览展示服务合同范本
- JBT 5300-2024 工业用阀门材料 选用指南(正式版)
- erp系统开发合同模板
- 2024风积沙路基填筑(干压法)施工技术规范
- SYT 7621-2021 碳酸盐岩缝洞型油藏开发方案编制技术规范-PDF解密
- 腾讯招聘测评题库答案大全
- HGT 6257-2023 纺织染整助剂 退浆剂 对聚丙烯酸类浆料退浆效果的测定 (正式版)
- 慢性病管理与家庭医生签约服务
评论
0/150
提交评论