package btools.server; import java.util.HashMap; import java.util.Map; public class IpAccessMonitor { private static Object sync = new Object(); private static Map ipAccess = new HashMap<>(); private static long MAX_IDLE = 900000; // 15 minutes private static long CLEANUP_INTERVAL = 10000; // 10 seconds private static long lastCleanup; public static boolean touchIpAccess(String ip) { long t = System.currentTimeMillis(); synchronized (sync) { Long lastTime = ipAccess.get(ip); ipAccess.put(ip, Long.valueOf(t)); return lastTime == null || t - lastTime.longValue() > MAX_IDLE; } } public static int getSessionCount() { long t = System.currentTimeMillis(); synchronized (sync) { if (t - lastCleanup > CLEANUP_INTERVAL) { cleanup(t); lastCleanup = t; } return ipAccess.size(); } } private static void cleanup(long t) { HashMap newMap = new HashMap<>(ipAccess.size()); for (Map.Entry e : ipAccess.entrySet()) { if (t - e.getValue().longValue() <= MAX_IDLE) { newMap.put(e.getKey(), e.getValue()); } } ipAccess = newMap; } }