Вопрос

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top