Очевидно, что вы захотите перевести спящий режим в блок finally, поэтому это также происходит, если задача выдает исключение (например, PasswordExpiredException?).
Другая проблема заключается в обработке случая elapsed > duration
.Вы говорите, что этого никогда не происходит, но уверены ли вы?Что если ваш запрос к базе данных будет заблокирован блокировкой?Предполагая, что вы хотите запретить аутентификацию в таком случае, вы можете сделать:
ExecutorService exec = Executors.newFixedThreadPool(10);
<T> T doInConstantTime(Callable<T> task, long millis, T defaultResponse) {
Future<T> future = exec.submit(task);
Thread.sleep(millis);
if (future.isDone()) {
return future.get();
} else {
future.cancel(false); // or true?
return defaultResponse;
}
}
(Конечно, вам нужно будет добавить правильную обработку исключений)
Я не уверен, хотя этохороший способ защиты от атак грубой силы.Вместо этого мы аннулируем логин пользователя после третьей неудачной попытки входа в систему (в течение определенного периода времени или до тех пор, пока администратор не разблокирует учетную запись).Упомяните где-нибудь, что вы делаете это, и ни у кого нет причин взламывать пароли.