public class RateLimitFilter extends java.lang.Object implements ServiceFilter
ServiceFilter
, der Aufrufe mittels RateLimiter
ueberwacht, und so Frequenzen limitiert aber auch Benutzer mittels
ApiKey (x-api-key) oder BasicAuth authentifiziert.
service.filter.1.class=de.cm.osm2po.service.filters.RateLimitFilter
service.filter.1.keystore=[user.home]/Desktop/apikeys.txt
service.filter.1.backup=[user.home]/Desktop/apikeys.backup
service.filter.1.basicauth=false (false=nur x-api-key als auth)
service.filter.1.refresh=1 (Minuten - Intervall fuer Keystore-Abgleich)
service.filter.1.ttl=5 (Minuten - MaxIdle fuer transientes RateLimit
)
Zusaetzlich koennen RateLimiter
-Defaults ueberschrieben werden.service.filter.1.limit=10,1 service.filter.1.limit.myfunc=5,1
limit
ist das Default RateLimit
, myfunc
hingegen das Default fuer den Aufruf eines speziellen Endpunkts. Ist ein
solcher mittels preHandle(ServiceRequest)
uebergeben worden, so wird
der Default-Schluessel, getrennt durch ein $
, um diesen erweitert
und stattdessen an RateLimiter.validate(String, RateLimit, java.util.List)
als anonLimit
-Default weitergereicht.$
-Erweiterung, so dass so ein Fallback auf ein
benutzerabhaengiges Default fuer alle anderen Endpunkte greift oder eben ein
Fallback auf das normale Default moeglich ist.
RateLimiter
selbst arbeitet mit einer optionalen Keystore-Datei.
Diese wird als Props
in den Speicher geladen und bietet so die
Moeglichkeit auch Variablen unterschiedlichster Herkunft zu verwenden.
good=10,1 bad=0 basicAuthUser@1355030580=[good] 66.6.6.6=[bad] premiumUser$myfunc=100,1,0,2050-01-01
myfunc
kann hier von premiumUser
100 mal in der
Sekunde ausgefuehrt werden, von anderen Benutzern hingegen nur 5 mal
(siehe Default-Limit oben).
Ein Schluessel kann sowohl eine IP, ein API-KEY, als auch ein BasicAuth
sein. Durch eine geschickte Vergabe, kann also auch eine IP (hier 66.6.6.6)
gesperrt werden.user@password
,
wobei letzteres als String.hashCode()
im KeyStore vorliegen muss.$
erweitert werden, also z.B. 66.6.6.6$=0
oder aber
auch badUserKey$=0
.RateLimit
,
RateLimiter
Constructor and Description |
---|
RateLimitFilter() |
Modifier and Type | Method and Description |
---|---|
void |
init(Config config,
int index)
Quasi-Konstruktor wird von
Osm2poService gerufen. |
void |
postHandle(ServiceRequest req,
ServiceResponse resp,
boolean sent)
Wird nach dem Schreiben der Response gerufen.
|
boolean |
preHandle(ServiceRequest sr)
Filtert einen HTTP-Request vor der Verarbeitung.
|
void |
shutDown()
Signal, dass Server gleich runterfaehrt.
|
public void init(Config config, int index)
ServiceFilter
Osm2poService
gerufen.init
in interface ServiceFilter
config
- Config
index
- int Index in der Konfigurationpublic boolean preHandle(ServiceRequest sr) throws java.lang.Exception
ServiceFilter
preHandle
in interface ServiceFilter
sr
- ServiceRequest
java.lang.Exception
- z.B. ServiceException
public void shutDown()
ServiceFilter
shutDown
in interface ServiceFilter
public void postHandle(ServiceRequest req, ServiceResponse resp, boolean sent)
ServiceFilter
ServiceFilter.preHandle(ServiceRequest)
erhalten hat.postHandle
in interface ServiceFilter
req
- ServiceRequest
, NULLABLEresp
- ServiceResponse
, NULLABLEsent
- true: Response gesendet, auch 404 und Co.