SSH集成框架下如何真正实现SpringAOP的拦截功能
来源:优易学  2011-12-19 15:59:19   【优易学:中国教育考试门户网】   资料下载   IT书店

  第三步:实现AOP切入编程:
  @Aspect
  @Component()
  public class PrivilegeAction {
  //拦截com.zjh包下(含子包)所有类能返回ActionForward类型的方法
  @Around("execution(org.apache.struts.action.ActionForward com.zjh..*.*(..))")
  public Object validatePrivilege(ProceedingJoinPoint pjp) throws Throwable{
  // 从拦截的方法中参数中得到四个对象
  ActionMapping mapping = (ActionMapping) pjp.getArgs()[0];
  ActionForm form = (ActionForm) pjp.getArgs()[1];
  HttpServletRequest request = (HttpServletRequest) pjp.getArgs()[2];
  HttpServletResponse response = (HttpServletResponse) pjp.getArgs()[3];
  //从拦截点处获取它所处的类名,并经过反射取得权限配置信息
  Class dispatchAction = Class.forName(pjp.getSignature().getDeclaringTypeName()); Object obj = dispatchAction.newInstance(); String mappingParament = mapping.getParameter()==null ? "execute" : request.getParameter(mapping.getParameter()); Method method = obj.getClass().getDeclaredMethod(mappingParament,
  ActionMapping.class,
  ActionForm.class,
  HttpServletRequest.class,
  HttpServletResponse.class); Privilege privilege = method.getAnnotation(Privilege.class);
  //如果方法上没有配置权限信息,直接放行
  if(privilege==null)
  return (ActionForward)pjp.proceed();
  //否则必须是登录用户,进行第一关粗粒度拦截
  User user = WebUtil.getUserInSession(request);
  if(user==null){
  request.setAttribute("message", privilege.message());
  return mapping.findForward("message");
  } //再根据用户类型进行细粒度拦截
  switch(privilege.userType().getValue()){
  //当权限为PrivilegeType.LoginUserSelf(登录用户自己,例如更新文章必须是自
  //己的文章才有权限更新)时,须从数据库里取得用户对象再和session中用
  //户匹配,这个没有实现。
  case 2:
  if(!user.getUsername().equals("数据库里取得某文章的用户名")){
  request.setAttribute("message", privilege.message());
  return mapping.findForward("message");
  }
  break;
  //版主权限拦截,这个没有实现
  case 3:
  request.setAttribute("message", privilege.message());
  return mapping.findForward("message");
  //管理员权限,从application取得管理员用户名,再匹配session登录用户是否相等
  case 4:
  String admin = ((SystemProperty)request.getSession().getServletContext().getAttribute("config"))
  .getAdminUsername();
  if(!user.getUsername().equals(admin)){
  request.setAttribute("message", privilege.message());
  return mapping.findForward("message");
  }
  break;
  }
  //当上面没有拦住,表示权限允许,放行
  return (ActionForward)pjp.proceed();
  }
  }
  以上细粒度拦截属业务逻辑,不妨碍本文所述的AOP切面编程。笔者仅仅是为学习AOP,真正用在真实项目的权限拦截,方案不太成熟。

上一页  [1] [2] 

责任编辑:小草

文章搜索:
 相关文章
热点资讯
资讯快报
热门课程培训