BasicAuthenticator
отвечает за отправку ответа 403. Если в запросе нет действительных учетных данных.
Глядя на источник Jetty 6, лучше всего подклассировать BasicAuthenticator и переопределить public void sendChallenge(UserRealm realm,Response response)
public class MyAuthenticator extends BasicAuthenticator {
@Override
public void sendChallenge(UserRealm realm, Response response) {
int numberOfAttempts = getNumberOfAuthenticationAttempts();
if (numberOfAttempts > 3) {
sendContactDetails(realm, response);
}
else
super.sendChallenge(realm, response);
}
protected int getNumberOfAuthenticationAttempts() { ... }
protected void sendContactDetails(Response response) { ... }
}
Очевидно, что проблема заключается в том, что у вас нет доступа к HttpServletRequest
, что может затруднить попытки запроса отслеживания.Возможно, вы могли бы получить доступ к этому через HttpConnection.getCurrentConnection()
.В противном случае код для BasicAuthenticator
не поддается расширению без капли копирования / вставки, но в вашем случае это может быть нормально.
Я игнорирую вопрос о том, как вы отслеживаете количествозапросы были сделаны в той же попытке аутентификации, которая будет зависеть от того, как подключаются ваши клиенты.
В качестве альтернативы вы можете установить ErrorHandler
в контексте, который используется, когда вызывается HttpResponse.sendError
,это будет тот случай, когда вы создадите исключение в своей сфере.
Я бы, вероятно, решил использовать первый метод, так как он более четко разделяет обязанности.