发表于: 2017-08-09 13:57:23
2 922
今天完成的:
环境搭好了
收获:
1.
Classpth:resourecs目录编译后源文件夹的非java文件会被copy到classes目录。
注意注解不要注到接口上,调用的时候声明是接口,但引用的是实现。
使用基于注解的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":"威少"}
遇到的问题:
无
明天的计划:
写代码
进度:
曾添完成了几个和前端约定的接口,测试通过
评论