Ограничить HTTP-запрос в Java-сервлете

#java #http #sockets #servlets #tcp

#java #http #сокеты #сервлеты #tcp

Вопрос:

Как я могу ограничить http-запросы, поступающие от пользователей, в Java servlet на основе IP-адреса клиента? Я не хочу обслуживать более X запросов в секунду, поступающих с определенного IP-адреса источника, где X настраивается и имеет практические значения в диапазоне [0.1; 10] (от 1 запроса за 10 секунд до 10 запросов в секунду).

Ответ №1:

Проект owasp-esapi-java, размещенный на code.google.com имеет реализацию дроссельного фильтра, который вы можете использовать «как есть» или использовать в качестве вдохновения для своего собственного.

Вы можете проверить код по следующей ссылке:

http://code.google.com/p/owasp-esapi-java/source/browse/trunk/src/main/java/org/owasp/esapi/filters/RequestRateThrottleFilter.java

Ответ №2:

Используйте фильтр сервлета: если вы используете Jetty 7.0 или более позднюю версию, есть это

Ответ №3:

Я бы написал фильтр для этой задачи.

Ответ №4:

Как сказал @EJP, используя фильтр с хэш-картой, который хранит время последнего доступа по ключу IP-адреса. 10 запросов в секунду будут переводиться как минимум в 100 мс между вызовами. Отправка кода ошибки занятости сервера обратно и завершение запроса быстро закроют ресурсы, используемые соединением. Существуют готовые решения для Apache, если это вариант для вас.

Ответ №5:

Проверьте, обеспечивает ли используемый вами контейнер такой тип отказа в обслуживании. Если нет, то вам придется использовать фильтр.

ServletRequest.getRemoteHost() предоставляет вам доступ к IP-адресу клиента.