用拦截器,注解实现权限

拦截器

package cn.itcast.crm.interceptor;

import java.lang.reflect.Method;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.apache.struts2.ServletActionContext;

import cn.itcast.crm.annotation.Limit;
import cn.itcast.crm.container.ServiceProvinder;
import cn.itcast.crm.domain.SysPopedomPrivilege;
import cn.itcast.crm.domain.SysUser;
import cn.itcast.crm.service.ISysPopedomPrivilegeService;
import cn.itcast.crm.util.SessionUtils;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;

public class LimitInterceptor extends MethodFilterInterceptor{

	@Override
	protected String doIntercept(ActionInvocation invocation) throws Exception {
		Object action = invocation.getAction(); //获得action
		String methodName = invocation.getProxy().getMethod(); //通过action代理获得方法名
		Method method = action.getClass().getMethod(methodName, null);
		HttpServletRequest httpServletRequest = ServletActionContext.getRequest();
		boolean flag = isCheckLimit(httpServletRequest,method); //检查该用户是否有此方法权限
		if (!flag) {
			System.out.println("没有权限");
			return "popmsg_popedom";
		}
		String result = invocation.invoke();  //继续下一个拦截器或者执行action
		return result;
	}

	private boolean isCheckLimit(HttpServletRequest httpServletRequest,
			Method method) {
		if (method==null) {
			return false;
		}
		SysUser sysUser = SessionUtils.getSysUserFormSession(httpServletRequest);
		if (sysUser==null) {
			return false;
		}
		if (sysUser.getSysRole()==null) {
			return false;
		}
		String roleId=sysUser.getSysRole().getId();
		boolean isAnnotationPresent = method.isAnnotationPresent(Limit.class); //此方法是否有注解limit
		if (!isAnnotationPresent) {
			return false;
		}
		Limit limit = method.getAnnotation(Limit.class); //获得该方法上的limit注解
		String privilege = limit.privilege();
		String module = limit.module();
		boolean flag = false; //查看该roleId的权限里面是否有注解的方法,有则有权限
		ISysPopedomPrivilegeService sysPopedomPrivilegeService = (ISysPopedomPrivilegeService) new ServiceProvinder().getBean(ISysPopedomPrivilegeService.SERVICE_NAME);
		List<SysPopedomPrivilege> sysPopedomPrivileges = sysPopedomPrivilegeService.findAllSysPopedomPrivileges();
		if (sysPopedomPrivileges!=null && sysPopedomPrivileges.size()!=0) {
			for(SysPopedomPrivilege sysPopedomPrivilege :sysPopedomPrivileges)
				if (roleId.equals(sysPopedomPrivilege.getId().getRoleId())
						&&privilege.equals(sysPopedomPrivilege.getId().getPopedomPrivilege())
						&&module.equals(sysPopedomPrivilege.getId().getPopedomModule())) {
					flag = true;
					break;
				}
		}
		return flag;
	}

}

limit注解

package cn.itcast.crm.annotation;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Retention(RetentionPolicy.RUNTIME)
public @interface Limit {
	String module();  //模块名称
	 String privilege(); //操作名称
}
定义拦截器栈
<package name="default" extends="struts-default" namespace="/sys">
	<interceptors>
  <interceptor name="limitInterceptor" class="cn.itcast.crm.interceptor.LimitInterceptor"/>
  <interceptor-stack name="limitStack">
    <interceptor-ref name="defaultStack"/>
    <interceptor-ref name="limitInterceptor">
      <param name="excludeMethods">isLogin,top,left</param>
    </interceptor-ref>
  </interceptor-stack>
</interceptors>
 <default-interceptor-ref name="limitStack"/>
 <global-results>
		<result name="popmsg_popedom">/WEB-INF/jsp/page/popmsg_popedom.jsp</result>
	</global-results>


注解应用

@Limit(module="user",privilege="list")
public String list() 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值