Java Authenticator для каждого соединения?
-
11-09-2019 - |
Вопрос
Я создаю плагин Eclipse, который взаимодействует с интерфейсом REST, который использует базовую аутентификацию.Когда аутентификация завершится неудачей, я хотел бы открыть диалоговое окно настроек моего плагина и повторить попытку.Обычно я мог бы использовать статический Authenticator.setDefault()
чтобы настроить аутентификатор для всех HttpURLConnection
's для этого, но поскольку я пишу плагин, я не хочу перезаписывать Eclipse по умолчанию Authenticator
(org.eclipse.ui.internal.net.auth
);
Я подумал о том, чтобы установить свой обычай Authenticator
перед загрузкой и последующей установкой Eclipse по умолчанию, но я предполагаю, что это вызовет всевозможные проблемы с многопоточностью, поэтому я быстро потерял это понятие.
Поиск в Google выдает всевозможные результаты, в основном говорящие мне, что это невозможно:
Java URLConnection API должен иметь метод setAuthenticator (аутентификатор), чтобы упростить использование этого класса в многопоточном контексте, где требуется аутентификация.
Если приложения содержат несколько сторонних плагинов и каждый плагин использует свой собственный аутентификатор, что мы должны делать?Каждый вызов метода "Authenticator.setDefault()" перезаписывает ранее определенный аутентификатор...
Существуют ли какие-либо различные подходы, которые могли бы помочь мне преодолеть эту проблему?
Решение
Если это невозможно с помощью HttpURLConnection, я бы предложил использовать с помощью HttpClient библиотека из Apache.
Краткий пример:
HttpClient client = new HttpClient();
client.getState().setCredentials(AuthScope.ANY, new UsernamePasswordCredentials("test","test"));
GetMethod getMethod = new GetMethod("http://www.example.com/mylogin");
client.executeMethod(getMethod);
System.out.println(getMethod.getResponseBodyAsString());
Другие советы
Другой подход заключался бы в том, чтобы самостоятельно выполнить базовую аутентификацию при подключении.
final byte[] encodedBytes = Base64.encodeData((username + ':' + new String(password)).getBytes("iso-8859-1"));
final String encoded = new String(encodedBytes, "iso-8859-1");
connection.setRequestProperty("Authorization", "Basic " + encoded);
Это также имело бы то преимущество, что не требовало бы, чтобы не прошедший проверку подлинности запрос получал 401 перед предоставлением учетных данных при последующем запросе.Аналогичное поведение может быть использовано в http-клиенте apache путем запроса упреждающей аутентификации.