Как обрабатывать HTTP-аутентификацию с использованием HttpURLConnection?
Я пишу Java-клиент, который отправляет на HTTP-сервер, который требует аутентификации.
Я должен поддерживать как минимум следующие три метода аутентификации: Basic, Digest или Negotiate. Кроме того, POST может быть очень большим (более 2 МБ), поэтому мне нужно использовать потоковую передачу. Как задокументировано для HttpURLConnection
Когда потоковая передача данных включена, аутентификация и перенаправление не могут быть обработаны автоматически. HttpRetryException будет генерироваться при чтении ответа, если требуется аутентификация или перенаправление.
Итак, мне нужно обработать аутентификацию самостоятельно. Я искал и снова искал способ использования уже закодированных классов - но не нашел пути...
Я мог бы просто взять нужные источники отсюда (так как они GPLv2 с исключением Classpath). Это правильный путь?
Благодарю.
2 ответа
Вам нужен поток вывода? 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();
Связанный с комментарием @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()));
}
Надеюсь, поможет!