diff --git a/src/main/java/com/sqx/common/aspect/IpAccessCounter.java b/src/main/java/com/sqx/common/aspect/IpAccessCounter.java index 4eefe9a2..eb624f07 100644 --- a/src/main/java/com/sqx/common/aspect/IpAccessCounter.java +++ b/src/main/java/com/sqx/common/aspect/IpAccessCounter.java @@ -6,6 +6,7 @@ import java.util.*; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; /** * @author GYJoker @@ -21,40 +22,75 @@ public class IpAccessCounter { // 十分钟的毫秒数 private static final long TEN_MINUTES = 10 * ONE_MINUTE; - static { - // 定时任务,每分钟清理一次访问记录 - ScheduledExecutorService executor = Executors.newScheduledThreadPool(1); - executor.scheduleAtFixedRate(() -> { - try { - long currentTime = System.currentTimeMillis(); - Set removedIps = new HashSet<>(); - IP_ACCESS_TIMES.forEach((ip, accessTimes) -> { - accessTimes.removeIf(time -> currentTime - time > ONE_MINUTE); - if (accessTimes.isEmpty()) { - removedIps.add(ip); - } - }); - removedIps.forEach(IP_ACCESS_TIMES::remove); + private static AtomicInteger removeCount = new AtomicInteger(0); - Set removedBlacklistIps = new HashSet<>(); - BLACKLIST.entrySet().removeIf(entry -> { - boolean shouldRemove = currentTime - entry.getValue() > TEN_MINUTES; - if (shouldRemove) { - removedBlacklistIps.add(entry.getKey()); - } - return shouldRemove; - }); +// static { +// // 定时任务,每分钟清理一次访问记录 +// ScheduledExecutorService executor = Executors.newScheduledThreadPool(1); +// executor.scheduleAtFixedRate(() -> { +// try { +// long currentTime = System.currentTimeMillis(); +// Set removedIps = new HashSet<>(); +// IP_ACCESS_TIMES.forEach((ip, accessTimes) -> { +// accessTimes.removeIf(time -> currentTime - time > ONE_MINUTE); +// if (accessTimes.isEmpty()) { +// removedIps.add(ip); +// } +// }); +// removedIps.forEach(IP_ACCESS_TIMES::remove); +// +// Set removedBlacklistIps = new HashSet<>(); +// BLACKLIST.entrySet().removeIf(entry -> { +// boolean shouldRemove = currentTime - entry.getValue() > TEN_MINUTES; +// if (shouldRemove) { +// removedBlacklistIps.add(entry.getKey()); +// } +// return shouldRemove; +// }); +// +// log.info("IpAccessCounter 清理完成,移除了 {} 个 IP 的黑名单记录,当前 BLACKLIST 大小: {}, IP_ACCESS_TIMES 大小: {}", +// removedBlacklistIps.size(), BLACKLIST.size(), IP_ACCESS_TIMES.size()); +// } catch (Exception e) { +// log.error("定时任务异常", e); +// } +// }, ONE_MINUTE, 20000, TimeUnit.MINUTES); +// } - log.info("IpAccessCounter 清理完成,移除了 {} 个 IP 的黑名单记录,当前 BLACKLIST 大小: {}, IP_ACCESS_TIMES 大小: {}", - removedBlacklistIps.size(), BLACKLIST.size(), IP_ACCESS_TIMES.size()); - } catch (Exception e) { - log.error("定时任务异常", e); - } - }, ONE_MINUTE, 20000, TimeUnit.MINUTES); + public static void removeOldInfo() { + try { + removeCount.set(0); + long currentTime = System.currentTimeMillis(); + Set removedIps = new HashSet<>(); + IP_ACCESS_TIMES.forEach((ip, accessTimes) -> { + accessTimes.removeIf(time -> currentTime - time > ONE_MINUTE); + if (accessTimes.isEmpty()) { + removedIps.add(ip); + } + }); + removedIps.forEach(IP_ACCESS_TIMES::remove); + + Set removedBlacklistIps = new HashSet<>(); + BLACKLIST.entrySet().removeIf(entry -> { + boolean shouldRemove = currentTime - entry.getValue() > TEN_MINUTES; + if (shouldRemove) { + removedBlacklistIps.add(entry.getKey()); + } + return shouldRemove; + }); + + log.info("IpAccessCounter 清理完成,移除了 {} 个 IP 的黑名单记录,当前 BLACKLIST 大小: {}, IP_ACCESS_TIMES 大小: {}", + removedBlacklistIps.size(), BLACKLIST.size(), IP_ACCESS_TIMES.size()); + } catch (Exception e) { + log.error("定时任务异常", e); + } } // 检查 IP 是否可以访问 public static boolean canAccess(String ip, Integer maxAccessCount) { + removeCount.getAndIncrement(); + if (removeCount.get() > 200) { + removeOldInfo(); + } if (isBlacklisted(ip)) { return false; }