org.voovan.http.server.filter.RateLimiterFilter Maven / Gradle / Ivy
package org.voovan.http.server.filter;
import org.voovan.http.server.HttpFilter;
import org.voovan.http.server.HttpRequest;
import org.voovan.http.server.HttpResponse;
import org.voovan.http.server.context.HttpFilterConfig;
import org.voovan.tools.collection.MultiMap;
import org.voovan.tools.bucket.Bucket;
import org.voovan.tools.collection.CacheMap;
import org.voovan.tools.bucket.LeakBucket;
import org.voovan.tools.bucket.TokenBucket;
import org.voovan.tools.log.Logger;
import org.voovan.tools.reflect.TReflect;
import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.BiFunction;
public class RateLimiterFilter implements HttpFilter {
private static MultiMap LIMITER_DEFINE_MAP = new MultiMap();
private static BiFunction bucketRelease = (key, limiter) -> {
limiter.getBucket().release();
return -1l;
};
private static CacheMap URL_LIMITER_MAP = new CacheMap(10000).autoRemove(true).interval(1).destory(bucketRelease).create();
private static CacheMap IP_LIMITER_MAP = new CacheMap(10000).autoRemove(true).interval(1).destory(bucketRelease).create();
private static CacheMap HEADER_LIMITER_MAP = new CacheMap(10000).autoRemove(true).interval(1).destory(bucketRelease).create();
private static CacheMap SESSION_LIMITER_MAP = new CacheMap(10000).autoRemove(true).interval(1).destory(bucketRelease).create();
private AtomicBoolean isInit = new AtomicBoolean(false);
@Override
public Object onRequest(HttpFilterConfig httpFilterConfig, HttpRequest httpRequest, HttpResponse httpResponse, Object o) {
List