Как обрабатывать HTTP-аутентификацию с использованием HttpURLConnection? - PullRequest
33 голосов
/ 03 февраля 2011

Я пишу Java-клиент, который отправляет POST-запросы на HTTP-сервер, требующий аутентификации .
Я должен поддерживать как минимум следующие три метода аутентификации: Basic, Digest или Negotiate.Кроме того, POST может быть очень большим (более 2 МБ), поэтому мне нужно использовать потоковую передачу.Как задокументировано для HttpURLConnection

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

Итак, мне нужно обработать аутентификацию самостоятельно.Я искал и снова искал способ использования уже закодированных классов - но не нашел способа ...

Я мог бы просто взять нужные источники из здесь (так как ониявляются GPLv2 с исключением Classpath).Это правильный путь?

Спасибо.

Ответы [ 2 ]

49 голосов
/ 03 февраля 2011

Вам нужен поток вывода? HttpURLConnection наиболее определенно поддерживает аутентификацию с классом Authenticator, см .: Аутентификация Http .

Обновление: В случае, если Authenticator не вариант, вы можете вручную выполнить базовую аутентификацию HTTP, добавив дополнительный заголовок к вашему HTTP-запросу. Попробуйте следующий код (не проверено):

String userPassword = username + ":" + password;
String encoding = new sun.misc.BASE64Encoder().encode(userPassword.getBytes());
URLConnection uc = url.openConnection();
uc.setRequestProperty("Authorization", "Basic " + encoding);
uc.connect();
4 голосов
/ 06 июня 2014

Относится к комментарию @ Mat:

Вот пример, используемый моей командой и мной:

import org.apache.commons.codec.binary.Base64;

HttpGet getRequest = new HttpGet(endpoint);
getRequest.addHeader("Authorization", "Basic " + getBasicAuthenticationEncoding());

private String getBasicAuthenticationEncoding() {

        String userPassword = username + ":" + password;
        return new String(Base64.encodeBase64(userPassword.getBytes()));
    }

Надеюсь, это поможет!

...