利用注解加拦截器实现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
原创粉丝点击