Spring-AOP之工作实践
Posted okho-ice
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring-AOP之工作实践相关的知识,希望对你有一定的参考价值。
案例一、角色校验
项目中,对某些方法需要用户具备指定角色权限才能执行。
/** * 角色校验注解 */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface HasRole { String[] value() default {}; }
/** * 角色校验切面 */ @Component @Aspect @Order(0) public class RoleAspect { @Autowired private UserService userService; // 切入点 @Pointcut("@annotation(com.demo.annotation.HasRole)") private void pointCut() {} // 前置通知,在执行目标方法之前执行 @Before("pointCut()") public void checkRole(Joinpoint joinpoint) { Signature signature = joinpoint.getSignature(); MethodSignature methodSignature = null; // 判断注解作用对象是否为方法 if (!(signature instanceof MethodSignature)) { throw new IllegalArgumentException("该注解只能用于方法"); } methodSignature = (MethodSignature) signature; // 获取当前访问的class Class<?> className = joinpoint.getTarget().getClass(); // 获取当前访问的方法名 String methodName = methodSignature.getName(); // 获取当前访问的方法形参类型 Class[] argClass = methodSignature.getParameterTypes(); // 获取当前访问的方法对象 Method method = className.getMethod(methodName, argClass); // 获取当前访问的方法上的注解 HasRole hasRole = method.getAnnotation(HasRole.class); // 校验权限,去数据库查是否有该权限 if (!userService.hasRole(hasRole.value())) { // 抛出自定义权限异常 throw new AuthorizationException("无权限"); } } }
/** * 目标对象 */ @Controller public class DemoController { // 目标方法,NeedRole:定义了角色权限的枚举类 @PostMapping @HasRole("NeedRole.ADMIN") public void demoMethod(String arg) { System.out.println("角色校验"); } }
以上是关于Spring-AOP之工作实践的主要内容,如果未能解决你的问题,请参考以下文章
Spring-AOP @AspectJ切点函数之@annotation()
Spring-AOP @AspectJ切点函数之@within()和@target