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