44 lines
1.2 KiB
Java
44 lines
1.2 KiB
Java
package btools.server;
|
|
|
|
import java.util.HashMap;
|
|
import java.util.Map;
|
|
|
|
public class IpAccessMonitor {
|
|
private static Object sync = new Object();
|
|
private static Map<String, Long> 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<String, Long> newMap = new HashMap<>(ipAccess.size());
|
|
for (Map.Entry<String, Long> e : ipAccess.entrySet()) {
|
|
if (t - e.getValue().longValue() <= MAX_IDLE) {
|
|
newMap.put(e.getKey(), e.getValue());
|
|
}
|
|
}
|
|
ipAccess = newMap;
|
|
}
|
|
|
|
}
|