import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicLong;
public class UrlParameterEnvironment {
private final Map<String, Long> requestCounts = new ConcurrentHashMap<>(); // Track request counts per URL parameter
private final Map<String, Long> lastRequestTimes = new ConcurrentHashMap<>(); // Track last request time per URL parameter
private final long rateLimitWindow = 60; // Time window in seconds
private final long maxRequestsPerWindow = 10; // Maximum requests allowed per window
public boolean isAllowed(String parameter) {
long now = System.currentTimeMillis();
long lastRequestTime = lastRequestTimes.getOrDefault(parameter, 0L);
// Check if within the rate limit window
if (now - lastRequestTime < rateLimitWindow * 1000) {
// Request is within the window, check if rate limit exceeded
long requestCount = requestCounts.getOrDefault(parameter, 0L);
if (requestCount >= maxRequestsPerWindow) {
return false; // Rate limit exceeded
}
return true; // Request allowed
} else {
// Request is outside the window, reset the count
requestCounts.remove(parameter);
lastRequestTimes.remove(parameter);
requestCounts.put(parameter, 1L);
lastRequestTimes.put(parameter, now);
return true; // Request allowed
}
}
public void incrementRequestCount(String parameter) {
requestCounts.compute(parameter, (key, count) -> (count == null) ? 1 : count + 1);
}
public long getRateLimitWindow() {
return rateLimitWindow;
}
public long getMaxRequestsPerWindow() {
return maxRequestsPerWindow;
}
}
Add your comment