From ce5f613e8b5f2f1a51ba31df09c1384548535597 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A7=8B=E8=BE=9E=E6=9C=AA=E5=AF=92?= <545073804@qq.com> Date: Fri, 25 Jul 2025 02:37:42 +0800 Subject: [PATCH] =?UTF-8?q?update=20=E9=99=90=E6=B5=81=E6=B3=A8=E8=A7=A3?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E6=B7=BB=E5=8A=A0=E5=88=B0=E7=B1=BB=E4=B8=8A?= =?UTF-8?q?=E9=9D=A2=EF=BC=8C=E5=AF=B9=E6=89=80=E6=9C=89=E8=A2=AB=E4=BB=A3?= =?UTF-8?q?=E7=90=86=E7=9A=84=E6=96=B9=E6=B3=95=E7=94=9F=E6=95=88=EF=BC=8C?= =?UTF-8?q?=E6=96=B9=E6=B3=95=E4=B8=8A=E7=9A=84=E6=B3=A8=E8=A7=A3=E4=BC=98?= =?UTF-8?q?=E5=85=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ratelimiter/annotation/RateLimiter.java | 2 +- .../aspectj/RateLimiterAspect.java | 24 +++++++++++++++++-- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/ruoyi-common/ruoyi-common-ratelimiter/src/main/java/org/dromara/common/ratelimiter/annotation/RateLimiter.java b/ruoyi-common/ruoyi-common-ratelimiter/src/main/java/org/dromara/common/ratelimiter/annotation/RateLimiter.java index 79272d41e..57b7877bd 100644 --- a/ruoyi-common/ruoyi-common-ratelimiter/src/main/java/org/dromara/common/ratelimiter/annotation/RateLimiter.java +++ b/ruoyi-common/ruoyi-common-ratelimiter/src/main/java/org/dromara/common/ratelimiter/annotation/RateLimiter.java @@ -9,7 +9,7 @@ import java.lang.annotation.*; * * @author Lion Li */ -@Target(ElementType.METHOD) +@Target({ElementType.METHOD, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface RateLimiter { diff --git a/ruoyi-common/ruoyi-common-ratelimiter/src/main/java/org/dromara/common/ratelimiter/aspectj/RateLimiterAspect.java b/ruoyi-common/ruoyi-common-ratelimiter/src/main/java/org/dromara/common/ratelimiter/aspectj/RateLimiterAspect.java index 2d6d82ea3..04301ff91 100644 --- a/ruoyi-common/ruoyi-common-ratelimiter/src/main/java/org/dromara/common/ratelimiter/aspectj/RateLimiterAspect.java +++ b/ruoyi-common/ruoyi-common-ratelimiter/src/main/java/org/dromara/common/ratelimiter/aspectj/RateLimiterAspect.java @@ -19,6 +19,7 @@ import org.springframework.context.expression.BeanFactoryResolver; import org.springframework.context.expression.MethodBasedEvaluationContext; import org.springframework.core.DefaultParameterNameDiscoverer; import org.springframework.core.ParameterNameDiscoverer; +import org.springframework.core.annotation.AnnotationUtils; import org.springframework.expression.Expression; import org.springframework.expression.ExpressionParser; import org.springframework.expression.ParserContext; @@ -50,8 +51,9 @@ public class RateLimiterAspect { private final ParameterNameDiscoverer pnd = new DefaultParameterNameDiscoverer(); - @Before("@annotation(rateLimiter)") - public void doBefore(JoinPoint point, RateLimiter rateLimiter) { + @Before("@annotation(org.dromara.common.ratelimiter.annotation.RateLimiter) || @within(org.dromara.common.ratelimiter.annotation.RateLimiter)") + public void doBefore(JoinPoint point) { + RateLimiter rateLimiter = getRateLimiter(point); int time = rateLimiter.time(); int count = rateLimiter.count(); int timeout = rateLimiter.timeout(); @@ -79,6 +81,24 @@ public class RateLimiterAspect { } } + private RateLimiter getRateLimiter(JoinPoint joinPoint){ + RateLimiter rateLimiter = null; + // 优先获取方法上的注解 + if (joinPoint.getSignature() instanceof MethodSignature signature) { + rateLimiter = AnnotationUtils.findAnnotation(signature.getMethod(), RateLimiter.class); + log.info("限流处理器拦截方法: {}\t方法是否具有限流注解:{}", signature.getMethod().getName(),rateLimiter != null); + } + + // 如果方法上不存在,则获取类上的注解 + if (rateLimiter == null) { + rateLimiter = AnnotationUtils.findAnnotation(joinPoint.getTarget().getClass(), RateLimiter.class); + log.info("限流处理器拦截类: {}\t类是否具有限流注解:{}", joinPoint.getTarget().getClass().getCanonicalName(),rateLimiter != null); + } + log.info("限流注解:{}",rateLimiter); + // 因为处理条件是 @annotation(RateLimiter) || @within(RateLimiter) ,所以方法上的注解或者类上的注解必然会一个不为空,否则不会进入到此代理方法 + return rateLimiter; + } + private String getCombineKey(RateLimiter rateLimiter, JoinPoint point) { String key = rateLimiter.key(); // 判断 key 不为空 和 不是表达式