发表于: 2017-08-09 13:57:23

2 922


今天完成的:

环境搭好了

收获:

1.

Classpth:resourecs目录编译后源文件夹的非java文件会被copyclasses目录。

注意注解不要注到接口上,调用的时候声明是接口,但引用的是实现。

使用基于注解的aop要开启驱动

<aop:aspectj-autoproxy/>

2.aop+自定义注解的权限管理

权限枚举

public enum  ACCESS {
LOOK,EXIT,DOWNLOAD,ADMIN
}

注解类

//元注解@Retention声明注解的保留期限,运行时保留,可通过反射读取注解信息
@Retention(RetentionPolicy.RUNTIME)
//声明可以使用该注解的目标类型,此为方法
@Target(ElementType.METHOD)
public @interface UserAccessAnnotation {
ACCESS value() default ACCESS.LOOK; //注解默认值
}

pointcut管理

public class SystemArchitecture {
//切点表达式为自定义的权限注解,使用自定义注解时,开始切面
   @Pointcut("@annotation(com.RedisAopTest.util.UserAccessAnnotation)")
public void userAccess(){
/**
       *@Author hfismyangel@163.com
       *@Description:
        * 一般情况下,我们把 PointCut 全部集中定义在 SystemArchitecture 类中,以方便修改和管理。
        * 这个类没有任何意义,只是管理切点
       *@Date: 10:59 2017/8/9
          * @param
       */
   }
}

aspect

@Aspect
public class PermissionAspect {
/*
   @before value指定aspect,可以加参数
   @annotation(你的自定义注解类名作为参数,所以首字母要小写),要和后面的argsName相同
    */

   @Before(value = "com.RedisAopTest.util.SystemArchitecture.userAccess() && @annotation(userAccessAnnotation)", argNames = "userAccessAnnotation")
public void checkPermission(UserAccessAnnotation userAccessAnnotation) throws Exception {
/**
       *@Author hfismyangel@163.com
       *@Description:
        * Enum提供了values方法,这个方法使你能够方便的遍历所有的枚举值。   
       Enum的oridinal的方法,这个方法返回枚举值在枚举类种的顺序,顺序根据枚举值声明的顺序而定,从0开始
       *@Date: 12:05 2017/8/9
          * @param userAccessAnnotation
       */
       System.out.println("=====================>>开始进行权限检查");
//        BIConversion.User user = (BIConversion.User) ActionContext.getContext().getSession().get("user");
//        if (user != null) {
//            if (user.getBehaviorLevel() < userAccessAnnotation.value().ordinal() + 1) {
//                throw new NoPermissionException("NO_ACCESS");
//            }
//        }
       if(userAccessAnnotation.value().ordinal()>2){
System.out.println("=====================>>操作成功!权限为:"+userAccessAnnotation.value());
       }else{
System.out.println("=====================>>没有权限执行操作");
           throw new NoPermissionException(("NO_ACCESS"));
       }
}


使用aop+注解的权限管理好处是方便,切面配置简单,一个配置在service的注解就能实现权限鉴定。缺点是较为简易,没有用户-角色-权限表,权限比较复杂时需要在aspect里写大量判断逻辑。使用拦截器也能进行权限鉴定,但都远不如使用安全框架。

3.aop advise

前置通知:在目标方法执行之前执行。

后置通知 :在目标方法执行之后执行,可以获取目标方法的返回值,当目标方法遇到异常,不执行。类似tryCatch中的finally,先准备执行return,再执行finally,最后return

最终通知:无论目标方法是否遇到异常都会执行,相当于代码中的finnaly

异常通知 :获取方法抛出的异常进行处理

后置通知:环绕通知围绕在连接点前后,比如一个方法调用的前后。这是最强大的通知类型,能在方法调用前后自定义一些操作。环绕通知还需要负责决定是继续处理join point(调用ProceedingJoinPoint的proceed方法)还是中断执行。 

4.fastjson和Gson的区别

fastjson是序列化和反序列化最快的工具没有之一。但如果序列化的对象存在get方法,它在序列化时会将get的返回值也序列化。如下:因此选择fastjson和Gson要根据具体的业务场景

、、、gson {"user_id":1,"user_name":"威少"

 、、、fastjson {"age":18,"pwd":"pwd","user_id":1,"user_name":"威少"}

遇到的问题:

明天的计划:

写代码

进度:

曾添完成了几个和前端约定的接口,测试通过


返回列表 返回列表
评论

    分享到