2012-03-21 24 views
5

Kimlik doğrulaması gerektiren anlaşılır bir web sunucusuyla konuşmam gerekiyor. Kimlik bilgileri sunmazsam, bir giriş formu görüntülenir. Ancak, istenmeyen Temel Kimlik Doğrulama bilgilerini sağlarım, doğrudan istenen içeriğe ulaşırım.Apache HTTP Bileşenleri ile HTTP kimlik doğrulaması: zorlama gönderimini zorlamak

wget bu doğrudan destekler:

# this fails and downloads a form: 
wget https://weird.egg/data.txt --http-user=me --http-password=shhh 

# this works and downloads the document: 
wget https://weird.egg/data.txt --http-user=me --http-password=shhh --auth-no-challenge 

Şimdi benim sorum: Nasıl Apache'nin HTTP Bileşenleri kullanarak Java indirme yapabilirsiniz?

Şimdiye dek elime geçenler. (Orada da yerinde bir proxy ve ben wget yılında -Y on kullanıyorum ve bir eşleştirme https_proxy ortam değişkeni var.) Ancak

import org.apache.http.client.HttpClient; 
import org.apache.http.client.methods.HttpGet; 
import org.apache.http.impl.client.DefaultHttpClient; 
import org.apache.http.conn.params.ConnRoutePNames; 
import org.apache.http.auth.AuthScope; 
import org.apache.http.auth.UsernamePasswordCredentials; 
import java.net.URI; 

// ... 

DefaultHttpClient hc = new DefaultHttpClient(); 
hc.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, new HttpHost(proxy_name, proxy_port)); 

URI uri = new URI("https://weird.egg/data.txt"); 

hc..getCredentialsProvider().setCredentials(new AuthScope(AuthScope.ANY_HOST, AuthScope.ANY_PORT, AuthScope.ANY_REALM, AuthScope.ANY_SCHEME), new UsernamePasswordCredentials("me", "shh")); 

hc.execute(new HttpGet(uri)); // etc 

, sadece giriş formu sayfasına değil, gerçek belge ile bitirmek. DefaultHttpClient'in wget'un yaptığı şekilde istenmeyen kimlik bilgilerini göndermediğinden şüpheleniyorum. Java programının kimlik bilgilerini göndermesinin bir yolu var mı?

cevap

10

Boş ver. Ben herhangi bir kütüphane kimlik doğrulama yöntemleri kullanmak çalışmıyorum sorunu çözüldü, ama sadece istek içine Temel Kimlik Doğrulama başlığını zorlaması:

HttpGet get = new HttpGet(uri); 

String basic_auth = new String(Base64.encodeBase64((username + ":" + password).getBytes())); 
get.addHeader("Authorization", "Basic " + basic_auth); 

hc.execute(get); // etc 

(Bu ek import org.apache.commons.codec.binary.Base64; ihtiyacı var, ancak buna karşılık biz diploma ve belgelere kaldırabilir ilgili ithalatlar.)

+0

Harika bir fikir, teşekkürler. Çerçeve çözümü de benim için çalışmadı. Başlığı el ile ekleyerek çalıştı. –

+0

Teşekkürler. Maven HTTP Wagon istemcisiyle aynı problemi yaşadım ve Header'ı elle ekleyerek çözdüm. –

+1

günümüzde sadece java.util.Base64.getEncoder() kullanabilirsiniz. EncodeToString (bir şey) ',' import org.apache.commons.codec.binary.Base64; ' – eis

İlgili konular