From b8c0b8b2d9ba90152f0bac4f475e600020a099bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=9D=BE?= <8605635+zhang3064194730@user.noreply.gitee.com> Date: Mon, 30 Dec 2024 13:14:59 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=B0=81=E7=A6=81=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E7=8A=B6=E6=80=81=E4=BB=85=E6=9B=B4=E6=94=B9=E4=B8=80=E6=AC=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../interceptor/AuthorizationInterceptor.java | 8 +++--- .../modules/redisService/RedisService.java | 2 ++ .../redisService/impl/RedisServiceImpl.java | 25 ++++++++----------- 3 files changed, 18 insertions(+), 17 deletions(-) diff --git a/src/main/java/com/sqx/modules/app/interceptor/AuthorizationInterceptor.java b/src/main/java/com/sqx/modules/app/interceptor/AuthorizationInterceptor.java index 0de3f7f2..1f8c2bb8 100644 --- a/src/main/java/com/sqx/modules/app/interceptor/AuthorizationInterceptor.java +++ b/src/main/java/com/sqx/modules/app/interceptor/AuthorizationInterceptor.java @@ -79,9 +79,11 @@ public class AuthorizationInterceptor extends HandlerInterceptorAdapter { // 检查用户是否超过限流 if (redisService.checkIpJumpLimit(userId, ip)) { log.warn("用户地址跳动频繁,封禁: {}", userId); - userService.update(null, new LambdaUpdateWrapper() - .eq(UserEntity::getUserId, userId) - .set(UserEntity::getStatus, 0)); + if (!redisService.isSetUserState(userId)) { + userService.update(null, new LambdaUpdateWrapper() + .eq(UserEntity::getUserId, userId) + .set(UserEntity::getStatus, 0)); + } throw new CzgException("ip跳动过于频繁,请联系管理员解封"); } diff --git a/src/main/java/com/sqx/modules/redisService/RedisService.java b/src/main/java/com/sqx/modules/redisService/RedisService.java index 1ed7cce8..c20bda12 100644 --- a/src/main/java/com/sqx/modules/redisService/RedisService.java +++ b/src/main/java/com/sqx/modules/redisService/RedisService.java @@ -19,4 +19,6 @@ public interface RedisService { void recordUrlVisitCountWithIp(long userId, String url, String ip); boolean isRecordUserOnLineTime(long userId); + + boolean isSetUserState(long userId); } diff --git a/src/main/java/com/sqx/modules/redisService/impl/RedisServiceImpl.java b/src/main/java/com/sqx/modules/redisService/impl/RedisServiceImpl.java index ec396317..1312ba9e 100644 --- a/src/main/java/com/sqx/modules/redisService/impl/RedisServiceImpl.java +++ b/src/main/java/com/sqx/modules/redisService/impl/RedisServiceImpl.java @@ -242,21 +242,18 @@ public class RedisServiceImpl implements RedisService { return false; } - - - - - // 增加跳动次数的记录 - private void increaseJumpCount(long userId) { - String jumpCountKey = "user:" + userId + ":jump_count"; // 跳动次数 - String jumpCount = redisTemplate.opsForValue().get(jumpCountKey); - - if (jumpCount == null) { - redisTemplate.opsForValue().set(jumpCountKey, "1", 1, TimeUnit.MINUTES); // 初始跳动 - } else { - int newJumpCount = Integer.parseInt(jumpCount) + 1; - redisTemplate.opsForValue().set(jumpCountKey, String.valueOf(newJumpCount), 1, TimeUnit.MINUTES); + @Override + public boolean isSetUserState(long userId) { + String userKey = "user:" + userId + ":state"; // 存储用户上次的 IP 地址 + String key = redisUtils.get(userKey); + if (StrUtil.isBlank(key)) { + DateTime date = DateUtil.date(); + Date tomorrow = DateUtil.beginOfDay(DateUtil.offsetDay(date, 1)); + long expire = DateUtil.between(date, tomorrow, DateUnit.SECOND); + redisUtils.set(key, userId, expire); + return false; } + return true; } // 记录用户访问 URL 的次数和 IP 地址