Переглянути джерело

update 优化 限流注解 key 支持简单 spel 表达式

疯狂的狮子Li 1 рік тому
батько
коміт
5b43d0e29f

+ 12 - 0
ruoyi-demo/src/main/java/com/ruoyi/demo/controller/RedisRateLimiterController.java

@@ -49,4 +49,16 @@ public class RedisRateLimiterController {
         return R.ok("操作成功", value);
     }
 
+    /**
+     * 测试请求IP限流(key基于参数获取)
+     * 同一IP请求受影响
+     *
+     * 简单变量获取 #变量 复杂表达式 #{#变量 != 1 ? 1 : 0}
+     */
+    @RateLimiter(count = 2, time = 10, limitType = LimitType.IP, key = "#value")
+    @GetMapping("/testObj")
+    public R<String> testObj(String value) {
+        return R.ok("操作成功", value);
+    }
+
 }

+ 9 - 1
ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/RateLimiterAspect.java

@@ -18,6 +18,7 @@ import org.redisson.api.RateType;
 import org.springframework.core.DefaultParameterNameDiscoverer;
 import org.springframework.core.ParameterNameDiscoverer;
 import org.springframework.expression.EvaluationContext;
+import org.springframework.expression.Expression;
 import org.springframework.expression.ExpressionParser;
 import org.springframework.expression.ParserContext;
 import org.springframework.expression.common.TemplateParserContext;
@@ -102,7 +103,14 @@ public class RateLimiterAspect {
             }
             // 解析返回给key
             try {
-                key = parser.parseExpression(key, parserContext).getValue(context, String.class) + ":";
+                Expression expression;
+                if (StringUtils.startsWith(key, parserContext.getExpressionPrefix())
+                    && StringUtils.endsWith(key, parserContext.getExpressionSuffix())) {
+                    expression = parser.parseExpression(key, parserContext);
+                } else {
+                    expression = parser.parseExpression(key);
+                }
+                key = expression.getValue(context, String.class) + ":";
             } catch (Exception e) {
                 throw new ServiceException("限流key解析异常!请联系管理员!");
             }