package btools.server; import java.util.HashMap; import java.util.Map; public class IpAccessMonitor { private static Object sync = new Object(); private static HashMap 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; } }