首页 > 代码库 > 利用注解加拦截器实现struts2的权限设置

利用注解加拦截器实现struts2的权限设置

需求分析:

   列出所有的权限,然后通过选择让每个部门拥有相关的权限,如果有该权限则可以进行操作,如果没有提示没有权限信息。


为了能够实现重用性,这里选择注解的形式

思路:既然利用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();// 首先获得请求的action
String methodString =invocation.getProxy().getMethod();// 获得请求的method名称
if(methodString == null) {
return "error";//返回错误页面
}
//获取action中的方法的封装 类(action中的方法没有参数)
Methodmethod = action.getClass().getMethod(methodString, null);
HttpServletRequestrequest = ServletActionContext.getRequest();// 获得request
boolean 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")则可以实现拦截


利用注解加拦截器实现struts2的权限设置