Аутентификатор Java для каждого соединения? - PullRequest
14 голосов
/ 01 марта 2009

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

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

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

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

Источник

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

Источник

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

Ответы [ 2 ]

9 голосов
/ 01 марта 2009

Если это невозможно с 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());
1 голос
/ 01 марта 2013

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

    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, запрашивая упреждающую аутентификацию.

...