Среда:
Веб-приложение на основе Java-EE
Проблема :
Необходимо ограничить пользователя выполнением более 5 (например) запросов в течение одной секунды (в основном BOT)
Решение :
В качестве базовой конструкции я планирую иметь 2 синхронизированных Map
в области приложения
Map<String, Map<Long, Integer>>
Строка
предназначена для идентификатора сеанса запроса
Long
предназначена для текущего второго представления
Integer
- удерживать счетчик запросов
Процесс:
Шаг 0:
Настройка фильтра
для перехвата каждого запроса
Шаг 1:
определение карты
Я посмотрю, является ли текущая минута
нечетной, тогда я добавлю данные на mapOne
и очищу mapTwo
Шаг 2:
карта процесса
int requestNoForThisSecond = mapXX.get(request.getSession().getId()).get(currentSecondRepresantationInLong);
if(requestNoForThisSecond <= 5){
requestNoForThisSecond++;
mapXX.get(request.getSession().getId()).put(currentSecondRepresantationInLong, requestNoForThisSecond);
}else{
response.sendRedirect();// redirect to some captcha page
}
Шаг 4:
также удалите запись сеанса, если сеанс истекает / пользователь выходит из системы
Это очень простой дизайн для проблемы
У кого-нибудь из вас есть идея / предложение получше?