2011-02-03 5 views
32

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

When output streaming is enabled, authentication and redirection cannot be handled automatically. A HttpRetryException will be thrown when reading the response if authentication or redirection are required.

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

Я мог бы просто вырвать необходимые источники из here (поскольку они являются GPLv2 с исключением класса). Правильно ли это?

Спасибо.

+0

какой вид аутентификации? HTTP BASIC Auth? Или что-то более сложное? – Tim

+0

Либо _Basic_, _Digest_ или _Negotiate_. Basic ** ** **. Остальные два не являются :) – Opher

ответ

47

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

Обновление: В случае, если 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(); 
+0

Да. Мой ** POST ** включает файл, размер которого может быть более 2 МБ. – Opher

+0

@ Opher: Я обновил свой ответ с помощью другого решения –

+0

Спасибо. Я обновил свой вопрос, чтобы уточнить, что мне нужно обрабатывать аутентификацию Basic, Digest или Negotiate. Что мне действительно нужно, это _Negotiate_ – Opher

4

, связанный с @ комментарием Мэта:

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

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())); 
    } 

Надеется, что это помогает!

+0

My Eclipse не нашел пакет кодеков, но вы можете напрямую загрузить его с http://commons.apache.org/proper/commons-codec/download_codec.cgi и добавить банку в качестве ссылки! – Tyron

Смежные вопросы