Springboot AOP注解实现切面拦截

发布时间 2023-12-07 17:49:12作者: BObO-B0BO

注解声明

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface xxxAnnotation {

    /**
     * 注解属性
     */
    Object xxx() default 5;


}

注解逻辑实现

/**
 * @author alpha.
 * @className xxxAnnotationExt
 * @date 2023/12/7 15:28
 */
@Slf4j
@Aspect
@Component
public class xxxAnnotationExt {

    //环绕通知(可以拿到controller请求参数)
    @Around("@annotation(com.deju.framework.aspectj.login.LoginExceptionIntercept)")
    public Object around(ProceedingJoinPoint pjp) throws Throwable {
        LoginExceptionIntercept intercept = getAnnotation(pjp);

        // 获取HttpServletRequest的参数
        参数类型 参数 = (LoginBody) pjp.getArgs()[0];
        String key = LOGIN_INTERCEPT_KEY + loginBody.getUsername();


        try {
            //todo
            // 放行原方法调用
            Object proceed = pjp.proceed();
            //todo
            //正常返回
            return proceed;
        } catch (Exception e) {
            // 异常todo
        }
    }

    private xxxAnnotation getAnnotation(ProceedingJoinPoint pjp) {
        MethodSignature signature = (MethodSignature) pjp.getSignature();
        Method method = signature.getMethod();
        Annotation annotation = method.getAnnotation(xxxAnnotation.class);
        return (xxxAnnotation) annotation;
    }
}