首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 计算机考试 > 认证考试 > JAVA认证 >

SSH集成框架下真正实现SpringAOP拦截功能(2)

2008-12-20 
巴巴运动网通过覆盖DelegatingRequestProcessor控制器的processActionPerform方法,是一种理想的解决方案,但严格来说并不是AOP切面编程方法。

    第三步:实现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,真正用在真实项目的权限拦截,方案不太成熟。




3COME考试频道为您精心整理,希望对您有所帮助,更多信息在http://www.reader8.com/exam/

热点排行