2011-02-03 35 views
32

kimlik doğrulaması gerektiren bir HTTP sunucusuna POST gönderen bir Java istemcisi yazıyorum.
En azından aşağıdaki üç kimlik doğrulama yöntemini desteklemem gerekiyor: Temel, Özet veya Anlaşma. Ek olarak, POST çok büyük olabilir (2MB üzeri), bu yüzden akışı kullanmam gerekiyor. gibi Yani HttpURLConnectionHttpURLConnection kullanarak HTTP kimlik doğrulaması nasıl kullanılır?

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.

için belgelenmiştir, kendime kimlik doğrulama işlemek gerekir. Daha önce kodlanmış, sınıfları işe almak için bir yol aradım ve tekrar aradım, fakat hiçbir yol bulamadı ...

Gerekli kaynakları sadece here'dan (Classpath istisnasıyla GPLv2 olduğu gibi) koparabilirim. Bu doğru yol mu?

Teşekkürler.

+0

Ne tür bir kimlik doğrulama? HTTP TEMEL Auth? Ya da daha karmaşık bir şey? – Tim

+0

Ya _Basic_, _Digest_ veya _Negotiate_. Temel ** kolay **. Diğer ikisi de değil :) – Opher

cevap

47

Çıkış akışına ihtiyacınız var mı? HttpURLConnection, kesinlikle Authenticator sınıfı ile kimlik doğrulamayı destekler, bkz: Http Authentication.

Güncelleme:Authenticator bir seçenek değilse, HTTP isteğinize ek bir başlık ekleyerek HTTP temel kimlik doğrulamasını el ile yapabilirsiniz. (Denenmemiş) Aşağıdaki kodu deneyin: @ için

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

Evet. My ** POST **, 2MB'nin üzerinde bir boyutta olabilen bir dosya içeriyor. – Opher

+0

@Opher: Cevabımı başka bir çözümle güncelledim –

+0

Teşekkürler. Temel, Özet veya Anlaşma kimlik doğrulamasıyla uğraşmam gerektiğini açıklamak için sorumu güncelledim. Gerçekten yardıma ihtiyacım olan şey, _Negotiate_ – Opher

4

İlgili Mat yorumuna:

İşte

ekibim ve ben tarafından kullanılan bir örnek:

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

yardımcı olur Umut!

+0

My Eclipse codec paketini bulamadı, ancak doğrudan http://commons.apache.org/proper/commons-codec/download_codec.cgi adresinden indirebilir ve jar'i referans olarak ekleyebilirsiniz! – Tyron

İlgili konular