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

Spring-AOP(面向切面编程)

spring-aop

Spring-AOP @AspectJ切点函数之args()和@args()

spring-AOP之通知和顾问