From 4b7efb7baea5b99d087b8d1c95eff704c053ab79 Mon Sep 17 00:00:00 2001 From: TanYibin <5491541@qq.com> Date: Tue, 13 Jun 2023 09:36:54 +0800 Subject: [PATCH] 访问限制添加优化 --- huaheng-wms-core/pom.xml | 9 +++++++-- huaheng-wms-core/src/main/java/org/jeecg/modules/wms/framework/controller/TestController.java | 2 +- huaheng-wms-core/src/main/java/org/jeecg/utils/HuahengRedisUtil.java | 8 ++++---- huaheng-wms-core/src/main/java/org/jeecg/utils/interceptor/AccessLimitInterceptor.java | 25 +++++++++++-------------- 4 files changed, 23 insertions(+), 21 deletions(-) diff --git a/huaheng-wms-core/pom.xml b/huaheng-wms-core/pom.xml index 076d6fe..c8fc1ae 100644 --- a/huaheng-wms-core/pom.xml +++ b/huaheng-wms-core/pom.xml @@ -42,7 +42,7 @@ <groupId>org.redisson</groupId> <artifactId>redisson</artifactId> </dependency> - + <dependency> <groupId>cn.monitor4all</groupId> <artifactId>log-record-starter</artifactId> @@ -54,6 +54,11 @@ <version>1.69</version> </dependency> <dependency> + <groupId>cn.hutool</groupId> + <artifactId>hutool-all</artifactId> + <version>5.4.7</version> + </dependency> + <dependency> <groupId>com.googlecode.log4jdbc</groupId> <artifactId>log4jdbc</artifactId> <version>1.2</version> @@ -128,7 +133,7 @@ <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency> - <!--获取apk信息--> + <!--获取apk信息 --> <dependency> <groupId>net.dongliu</groupId> <artifactId>apk-parser</artifactId> diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/framework/controller/TestController.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/framework/controller/TestController.java index 47d7af5..2091af3 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/framework/controller/TestController.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/framework/controller/TestController.java @@ -46,7 +46,7 @@ public class TestController extends HuahengBaseController { @Autowired private ApplicationConfig applicationConfig; -// @AccessLimit(seconds = 1, maxCount = 10) + @AccessLimit(seconds = 10, maxCount = 2) @PostMapping(value = "/testLimiter") public Result<?> testLimiter(@RequestBody Map<String, String> paramMap) { return Result.OK(); diff --git a/huaheng-wms-core/src/main/java/org/jeecg/utils/HuahengRedisUtil.java b/huaheng-wms-core/src/main/java/org/jeecg/utils/HuahengRedisUtil.java index 17ea09f..4fc4436 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/utils/HuahengRedisUtil.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/utils/HuahengRedisUtil.java @@ -3,9 +3,9 @@ package org.jeecg.utils; import java.util.concurrent.TimeUnit; import javax.annotation.Nonnull; -import javax.annotation.Resource; -import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; @@ -23,8 +23,8 @@ import lombok.extern.slf4j.Slf4j; @Component public class HuahengRedisUtil { - @Resource - private RedisTemplate<String, String> redisTemplate; + @Autowired + private StringRedisTemplate redisTemplate; private static String toJson(Object obj) { if (obj == null) { diff --git a/huaheng-wms-core/src/main/java/org/jeecg/utils/interceptor/AccessLimitInterceptor.java b/huaheng-wms-core/src/main/java/org/jeecg/utils/interceptor/AccessLimitInterceptor.java index 4709252..3fc6821 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/utils/interceptor/AccessLimitInterceptor.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/utils/interceptor/AccessLimitInterceptor.java @@ -37,26 +37,23 @@ public class AccessLimitInterceptor extends HandlerInterceptorAdapter { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { if (handler instanceof HandlerMethod) { - HandlerMethod hm = (HandlerMethod)handler; + HandlerMethod handlerMethod = (HandlerMethod)handler; // 获取方法中的注解,看是否有该注解 - AccessLimit accessLimit = hm.getMethodAnnotation(AccessLimit.class); + AccessLimit accessLimit = handlerMethod.getMethodAnnotation(AccessLimit.class); if (accessLimit == null) { return true; } int seconds = accessLimit.seconds(); int maxCount = accessLimit.maxCount(); - String requestURI = request.getRequestURI(); - log.info(ServletUtil.getBody(request)); - Integer count = huahengRedisUtil.get(requestURI, Integer.class); - if (count == null) { - // 第一次访问 - huahengRedisUtil.set(requestURI, 1, seconds); - } else if (count < maxCount) { - // 加1 - huahengRedisUtil.incr(requestURI, seconds); - } else { - log.error("{},超出访问频次限制。限制频次:{}次/{}秒", requestURI, maxCount, seconds); - throw new JeecgBootException("超出访问频次限制"); + String accessLimitKey = "Access_Limit_" + request.getRequestURI(); + synchronized (accessLimitKey) { + Integer count = huahengRedisUtil.get(accessLimitKey, Integer.class); + if (count == null || count < maxCount) { + huahengRedisUtil.incr(accessLimitKey, seconds); + } else { + log.error("{},超出访问频次限制。限制频次:{}秒{}次", request.getRequestURI(), maxCount, seconds); + throw new JeecgBootException("超出访问频次限制"); + } } } return true; -- libgit2 0.22.2