#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 имеет реализацию дроссельного фильтра, который вы можете использовать «как есть» или использовать в качестве вдохновения для своего собственного.
Вы можете проверить код по следующей ссылке:
Ответ №2:
Используйте фильтр сервлета: если вы используете Jetty 7.0 или более позднюю версию, есть это
Ответ №3:
Я бы написал фильтр для этой задачи.
Ответ №4:
Как сказал @EJP, используя фильтр с хэш-картой, который хранит время последнего доступа по ключу IP-адреса. 10 запросов в секунду будут переводиться как минимум в 100 мс между вызовами. Отправка кода ошибки занятости сервера обратно и завершение запроса быстро закроют ресурсы, используемые соединением. Существуют готовые решения для Apache, если это вариант для вас.
Ответ №5:
Проверьте, обеспечивает ли используемый вами контейнер такой тип отказа в обслуживании. Если нет, то вам придется использовать фильтр.
ServletRequest.getRemoteHost() предоставляет вам доступ к IP-адресу клиента.