From 6cf353c31ed73129718ef337d8525f6539761756 Mon Sep 17 00:00:00 2001 From: D <3066417822@qq.com> Date: Thu, 25 Jan 2024 10:58:24 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E9=99=90=E6=B5=81=E7=9A=84?= =?UTF-8?q?=E6=93=8D=E4=BD=9C=E7=B1=BB=E5=9E=8B=EF=BC=8C=E8=A1=A5=E5=85=85?= =?UTF-8?q?CommonController=E6=B3=A8=E8=A7=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/限流逻辑.drawio | 37 ++++++++++++++++++ .../controller/common/CommonController.java | 5 ++- .../ruoyi/common/annotation/RateLimiter.java | 1 + .../com/ruoyi/common/enums/LimitType.java | 15 +++++-- .../framework/aspectj/RateLimiterAspect.java | 39 ++++++++----------- 5 files changed, 70 insertions(+), 27 deletions(-) create mode 100644 doc/限流逻辑.drawio diff --git a/doc/限流逻辑.drawio b/doc/限流逻辑.drawio new file mode 100644 index 0000000..eceb279 --- /dev/null +++ b/doc/限流逻辑.drawio @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CommonController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CommonController.java index ef30a04..d966ad8 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CommonController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CommonController.java @@ -25,6 +25,7 @@ import com.ruoyi.framework.config.ServerConfig; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameters; +import io.swagger.v3.oas.annotations.parameters.RequestBody; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; @@ -85,7 +86,7 @@ public class CommonController { */ @Operation(summary = "通用上传请求(单个)") @PostMapping("/upload") - public AjaxResult uploadFile(MultipartFile file) throws Exception { + public AjaxResult uploadFile(@RequestBody MultipartFile file) throws Exception { try { // 上传文件路径 String filePath = RuoYiConfig.getUploadPath(); @@ -108,7 +109,7 @@ public class CommonController { */ @Operation(summary = "通用上传请求(多个)") @PostMapping("/uploads") - public AjaxResult uploadFiles(List files) + public AjaxResult uploadFiles(@RequestBody List files) throws Exception { try { // 上传文件路径 diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/RateLimiter.java b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/RateLimiter.java index 0f024c7..49e031f 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/RateLimiter.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/RateLimiter.java @@ -5,6 +5,7 @@ import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; + import com.ruoyi.common.constant.CacheConstants; import com.ruoyi.common.enums.LimitType; diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/LimitType.java b/ruoyi-common/src/main/java/com/ruoyi/common/enums/LimitType.java index c609fd8..9ae87f6 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/enums/LimitType.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/LimitType.java @@ -6,8 +6,7 @@ package com.ruoyi.common.enums; * @author ruoyi */ -public enum LimitType -{ +public enum LimitType { /** * 默认策略全局限流 */ @@ -16,5 +15,15 @@ public enum LimitType /** * 根据请求者IP进行限流 */ - IP + IP, + + /** + * 根据请求者的用户ID进行限流 + */ + USER, + + /** + * 根据请求者的部门进行限流 + */ + DEPT, } diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/RateLimiterAspect.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/RateLimiterAspect.java index b720bc1..9d27f59 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/RateLimiterAspect.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/RateLimiterAspect.java @@ -3,6 +3,7 @@ package com.ruoyi.framework.aspectj; import java.lang.reflect.Method; import java.util.Collections; import java.util.List; + import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; @@ -13,9 +14,11 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.script.RedisScript; import org.springframework.stereotype.Component; + import com.ruoyi.common.annotation.RateLimiter; import com.ruoyi.common.enums.LimitType; import com.ruoyi.common.exception.ServiceException; +import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.ip.IpUtils; @@ -26,8 +29,7 @@ import com.ruoyi.common.utils.ip.IpUtils; */ @Aspect @Component -public class RateLimiterAspect -{ +public class RateLimiterAspect { private static final Logger log = LoggerFactory.getLogger(RateLimiterAspect.class); private RedisTemplate redisTemplate; @@ -35,50 +37,43 @@ public class RateLimiterAspect private RedisScript limitScript; @Autowired - public void setRedisTemplate1(RedisTemplate redisTemplate) - { + public void setRedisTemplate1(RedisTemplate redisTemplate) { this.redisTemplate = redisTemplate; } @Autowired - public void setLimitScript(RedisScript limitScript) - { + public void setLimitScript(RedisScript limitScript) { this.limitScript = limitScript; } @Before("@annotation(rateLimiter)") - public void doBefore(JoinPoint point, RateLimiter rateLimiter) throws Throwable - { + public void doBefore(JoinPoint point, RateLimiter rateLimiter) throws Throwable { int time = rateLimiter.time(); int count = rateLimiter.count(); String combineKey = getCombineKey(rateLimiter, point); List keys = Collections.singletonList(combineKey); - try - { + try { Long number = redisTemplate.execute(limitScript, keys, count, time); - if (StringUtils.isNull(number) || number.intValue() > count) - { + if (StringUtils.isNull(number) || number.intValue() > count) { throw new ServiceException("访问过于频繁,请稍候再试"); } log.info("限制请求'{}',当前请求'{}',缓存key'{}'", count, number.intValue(), combineKey); - } - catch (ServiceException e) - { + } catch (ServiceException e) { throw e; - } - catch (Exception e) - { + } catch (Exception e) { throw new RuntimeException("服务器限流异常,请稍候再试"); } } - public String getCombineKey(RateLimiter rateLimiter, JoinPoint point) - { + public String getCombineKey(RateLimiter rateLimiter, JoinPoint point) { StringBuffer stringBuffer = new StringBuffer(rateLimiter.key()); - if (rateLimiter.limitType() == LimitType.IP) - { + if (rateLimiter.limitType() == LimitType.IP) { stringBuffer.append(IpUtils.getIpAddr()).append("-"); + } else if (rateLimiter.limitType() == LimitType.USER) { + stringBuffer.append(SecurityUtils.getUserId()).append("-"); + } else if (rateLimiter.limitType() == LimitType.DEPT) { + stringBuffer.append(SecurityUtils.getDeptId()).append("-"); } MethodSignature signature = (MethodSignature) point.getSignature(); Method method = signature.getMethod();