Java Authenticator для каждого соединения?

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

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

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

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

Источник

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

Источник

Есть ли какие-либо другие подходы, которые могут помочь мне решить эту проблему?

Ответов (2)

Решение

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