Java Authenticator для каждого подключения?

Я создаю плагин Eclipse, который разговаривает с интерфейсом REST, который использует базовую аутентификацию. Когда аутентификация завершится неудачно, я хотел бы открыть диалоговое окно настроек плагина и повторить попытку. Обычно я мог использовать статический Authenticator.setDefault() для установки аутентификатора для всех HttpURLConnection для этого, но так как я пишу плагин, я не хочу перезаписывать Eclipse по умолчанию Authenticator (org.eclipse.ui.internal.net.auth);

Я подумал о том, чтобы установить свой пользовательский Authenticator перед загрузкой и по умолчанию включить Eclipse default, но я предполагаю, что это вызовет всевозможные проблемы гонки с многопоточным процессом, поэтому я быстро потерял это понятие.

Поиски Google дают всевозможные результаты, в основном говорящие мне, что это невозможно:

API URL-адреса Java API должен иметь метод setAuthenticator (Authenticator) для упрощения использования этого класса в многопоточном контексте, где требуется аутентификация.

Источник

Если приложения содержат несколько сторонних плагинов, и каждый плагин использует собственный Authenticator, что мы должны делать? Каждый вызов метода Authenticator.setDefault() переписывает ранее определенный Authenticator...

Источник

Существуют ли разные подходы, которые могут помочь мне преодолеть эту проблему?

Ответ 1

Если это невозможно с 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());

Ответ 2

Другим подходом было бы выполнить базовую аутентификацию самостоятельно в соединении.

    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, запросив предварительную аутентификацию.