利用注解加拦截器实现struts2的权限设置
来源:互联网 发布:qq三国js技能介绍 编辑:程序博客网 时间:2024/04/30 16:55
需求分析:
列出所有的权限,然后通过选择让每个部门拥有相关的权限,如果有该权限则可以进行操作,如果没有提示没有权限信息。
为了能够实现重用性,这里选择注解的形式
思路:既然利用struts2做,那么实现自定义拦截器就可以方便的实现对action中的方法的拦截与放行,首先建立权限表,把系统所有的功能全部列出来,如图1所示。
建立表存放系统所有的功能项sys_popedom,建立字段 popodomModule(模块的部门组),popedomPrivilege(模块的具体部门的具体功能),sort(排序),title,popedomName(名称)
建立表存放权限sys_popedom_privilege建立字段 rid(这是部门id),popedomModule,popedomPrivilege
建立Limit接口
packagecom.jrrjw.annotation;importjava.lang.annotation.Retention;importjava.lang.annotation.RetentionPolicy;@Retention(RetentionPolicy.RUNTIME)public @interfaceLimit {Stringmodule(); // 模块名称Stringprivilege(); // 操作名称}
建立拦截器
packagecom.jrrjw.inteceptor;importjava.lang.reflect.Method;importjava.util.Collection;importjava.util.List;importjavax.servlet.http.HttpServletRequest;importorg.apache.struts2.ServletActionContext;importcom.jrrjw.crm.annotation.Limit;importcom.jrrjw.crm.container.ServiceProvider;importcom.jrrjw.crm.domain.sysPopedomPrivilege;importcom.jrrjw.crm.domain.sysUser;importcom.jrrjw.crm.service.sysPopeDomPrivilegeService;importcom.jrrjw.crm.utils.sessionUtils;importcom.opensymphony.xwork2.ActionInvocation;importcom.opensymphony.xwork2.interceptor.MethodFilterInterceptor;public classLimitInterceptor extends MethodFilterInterceptor {protectedString doIntercept(ActionInvocation invocation) throws Exception {Objectaction = invocation.getAction();// 首先获得请求的actionString methodString =invocation.getProxy().getMethod();// 获得请求的method名称if(methodString == null) {return "error";//返回错误页面}//获取action中的方法的封装 类(action中的方法没有参数)Methodmethod = action.getClass().getMethod(methodString, null);HttpServletRequestrequest = ServletActionContext.getRequest();// 获得requestboolean flag = checkLimit(request, method);//检查注解与请求的方法与当前用户的权限关系主要代码在该方法实现if(!flag) {return "error";}else {StringresultName = invocation.invoke();returnresultName;}}privateboolean checkLimit(HttpServletRequest request, Method method) {sysUseruser = sessionUtils.getSessionUser(request);// 获得当前登陆的用户Integer roleId =user.getSysRole().getRid();//获得当前用户所在的组boolean anno =method.isAnnotationPresent(Limit.class);//判断该方法上有无注解if(!anno) {returnfalse;}Limitlimit = method.getAnnotation(Limit.class); // 获得该方法名称上所加的注解Stringmodule = limit.module(); // 模块名称Stringprivilege = limit.privilege(); // 操作名称//查询数据库,看是否存在roleId module privilege 这三个字段sysPopeDomPrivilegeServicepopeDomPrivilegeService = (sysPopeDomPrivilegeService) ServiceProvider.getService(sysPopeDomPrivilegeService.service_bean);List<sysPopedomPrivilege>privileges = (List<sysPopedomPrivilege>) popeDomPrivilegeService.getAllPrivilege();for (int i = 0; i <privileges.size(); i++) {//为了以后能使用二级缓存,这里把权限数据全部查出来sysPopedomPrivileges = privileges.get(i);if(roleId.equals(s.getId().getRoleId())&&module.equals(s.getId().getPopedomModule())&&privilege.equals(s.getId().getPopedomPrivilege())) {returntrue;}}returnfalse;}}
此时,需要配置struts2的配置文件修改默认的拦截器栈
<packagename="main" namespace="/"extends="struts-default"> <interceptors><interceptorname="LimitInteceptor"class="com.jrrjw.crm.inteceptor.LimitInterceptor"></interceptor><interceptor-stackname="Limit"><interceptor-refname="defaultStack" /><interceptor-refname="LimitInteceptor"><!--配置哪些方法不被拦截 --><paramname="excludeMethods">login,top,left</param></interceptor-ref></interceptor-stack></interceptors><default-interceptor-refname="Limit"></default-interceptor-ref><global-results><resultname="error">/WEB-INF/jsp/error.jsp</result></global-results></package>
然后在action中的方法名称前加上@Limit(module = "group",privilege = "save")则可以实现拦截
0 0
- 利用注解加拦截器实现struts2的权限设置
- 利用struts2拦截器加自定义注解实现权限控制
- 简单的利用Struts2拦截器实现权限校验
- 自定义注解+Struts2拦截器实现简单权限控制
- struts2 使用注解、反射、拦截器实现基于方法的权限控制
- 使用Struts2的拦截器和自定义注解方式实现权限控制
- struts2中利用拦截器实现权限管理
- struts2实现权限拦截
- 用拦截器,注解实现权限
- 自定义注解+拦截器实现权限控制
- 自定义注解+拦截器实现权限控制
- 在struts2.1中使用注解和拦截器实现权限细粒度控制
- 在struts2.1中使用注解和拦截器实现权限细粒度控制
- 使用Struts2的拦截器实现权限控制
- 使用Struts2的拦截器实现权限控制
- 用struts2拦截器实现权限检查
- 通过struts2拦截器实现权限管理
- struts2 实现权限控制拦截器
- HP大中华区总裁孙振耀退休感言
- Huffman Algorithm (ii) 计算字符权重
- Java类加载器总结
- 使用Jlink对FL2440开发板进行烧录
- 隐马尔科夫模型
- 利用注解加拦截器实现struts2的权限设置
- iOS设计模式 - (3)简单工厂模式
- 贪心算法的分数背包问题的介绍与理解1(含c源代码)
- 树状数组——————二分索引树
- hdu 1028 Ignatius and the Princess III
- 高效求解平方根的倒数的函数实现
- 如何用Cocos2d-x创建lua项目以及lua项目如何调用cpp文件(图文讲解)
- Android Fragment IllegalStateException: Fragment not attached to Activity
- SpringMVC表单标签简介