2012-03-21 20 views
5

को भेजने की शक्ति मुझे एक अस्पष्ट वेबसर्वर से बात करने की आवश्यकता है जिसके लिए प्रमाणीकरण की आवश्यकता है। अगर मैं प्रमाण-पत्र नहीं देता हूं, तो लॉगिन फॉर्म प्रदर्शित होता है। हालांकि, अगर मैं अनचाहे मूल प्रमाणीकरण प्रमाण-पत्रों की आपूर्ति करता हूं, तो मैं सीधे वांछित सामग्री पर जाता हूं।अपाचे HTTP घटक के साथ HTTP प्रमाणीकरण: चुनौती

wget इस सीधे समर्थन करता है:

# 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 

अब मेरे सवाल: मैं कैसे जावा में डाउनलोड अपाचे के HTTP अवयव का उपयोग कर बना सकते हैं?

यहां तक ​​कि मुझे अब तक क्या मिला है। (इसके अलावा कई जगह में एक प्रॉक्सी है, और मैं wget में -Y on उपयोग करते हैं, और मैं एक मिलान https_proxy वातावरण चर की है।)

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 

हालांकि, मैं केवल लॉगिन प्रपत्र पेज, न कि वास्तविक दस्तावेज़ के साथ खत्म। मुझे संदेह है कि DefaultHttpClient wget करता है, जिस तरह से अनचाहे प्रमाण पत्र नहीं भेज रहा है। क्या जावा प्रोग्राम को प्रमाण पत्र भेजने का कोई तरीका है?

उत्तर

10

कोई बात नहीं। मैं किसी भी पुस्तकालय प्रमाणीकरण तरीकों का उपयोग करने की कोशिश कर नहीं द्वारा समस्या हल, लेकिन सिर्फ जानवर-मजबूर कर अनुरोध में बुनियादी प्रमाणीकरण हैडर:

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 

(इस अतिरिक्त import org.apache.commons.codec.binary.Base64; जरूरत है, लेकिन बदले में हम credential- को हटा सकते हैं संबंधित आयात।)

+0

महान विचार, धन्यवाद। ढांचा समाधान भी मेरे लिए काम नहीं करता था। मैन्युअल रूप से हेडर जोड़ना काम किया। –

+0

धन्यवाद। मुझे मेवेन HTTP वैगन क्लाइंट के साथ एक ही समस्या थी और मैन्युअल रूप से हेडर जोड़कर इसे हल करें। –

+1

आजकल आप 'java.util.Base64.getEncoder()। EncodeToString (कुछ)' का उपयोग कर सकते हैं, 'import org.apache.commons.codec.binary.Base64 पर निर्भर रहने की आवश्यकता नहीं है;' – eis