2011-10-04 19 views
17

मैं जावा में एक http कनेक्शन खोलने के लिए निम्नलिखित कोड का उपयोग कर रहा:क्या मैं जावा के HttpUrlConnection क्लास का उपयोग कर होस्ट हेडर को ओवरराइड कर सकता हूं?

URL url = new URL("http://stackoverflow.com"); 
HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
conn.setDoOutput(true); 
conn.setRequestMethod("GET"); 
conn.setRequestProperty("Host", "Test:8080"); 
conn.getOutputStream(); 

हालांकि conn.setRequestProperty बुला ("होस्ट", "टेस्ट: 8080") कोई असर नहीं दिखाई देता है क्या आदेश की परवाह किए बिना मैं विधियों को कॉल करें और होस्ट गंतव्य सर्वर पर रीसेट कर दिया गया है। क्या अलग-अलग लाइब्रेरी का उपयोग किए बिना होस्ट हेडर को ओवरराइड करने का कोई तरीका है?

TIA मैट

उत्तर

6

Host हैडर URL पर आधारित HttpURLConnection से भर जाता है। आप foo.comHost=bar.com के साथ नहीं खोल सकते हैं। RFC

से होस्ट अनुरोध हेडर फ़ील्ड संसाधन की इंटरनेट मेजबान और पोर्ट संख्या अनुरोध किया जा रहा है, साथ मूल यूआरआई उपयोगकर्ता या चर्चा करते हुए संसाधन द्वारा दिए गए (आम तौर पर एक HTTP यूआरएल)

से प्राप्त निर्दिष्ट करता है

Btw, आप भी apache http components कोशिश कर सकते हैं।

+1

धन्यवाद ChunkStreamMode के साथ एक HTTPUrlConnection लौटने के लिए "createConnection" समारोह ओवरराइड करने के लिए है यह अच्छी तरह से आरएफसी के अनुरूप हो सकता है लेकिन यह बहुत उपयोगी नहीं है क्योंकि मैं एक रिवर्स प्रॉक्सी को कार्यान्वित करने की कोशिश कर रहा हूं जिसके लिए होस्ट हेडर पर पोर्ट को संशोधित करने की आवश्यकता है क्योंकि गंतव्य सर्वर पोर्ट मैपिंग की अपेक्षा कर रहा है। – Matt

+0

आप Apache HTTP घटकों की कोशिश कर सकते – Bozho

+0

धन्यवाद, मैं मैं करने के लिए है जाएगा। हालांकि यह और अधिक काम है। – Matt

25

यह अतीत में काम करता था, लेकिन यह एक सुरक्षा ठीक के हिस्से के रूप निष्क्रिय कर दिया गया। स्पष्ट रूप से चेंजलॉग में एक नोट के बिना। Bugs.sun.com पर इसके लिए #7022056 जैसी बग भी हैं।

एक और शीर्ष लेख, जहां जवाब विस्तार में अधिक चला जाता है के लिए एक similar question नहीं है, इसलिए मैं सिर्फ यह बजाय लिंक इसे अपने आप को लिखने की। :-)

एकमात्र कामकाज sun.net.http.allowRestrictedHeaders से true पर सेट करना प्रतीत होता है या पहले से उल्लिखित http components जैसे किसी अन्य http-Library का उपयोग करता है।

+6

धन्यवाद, 'System.setProperty (" sun.net.http.allowRestrictedHeaders "," सच ")' महान काम करता है। –

+0

आह, बस कुछ घंटों बिताए और इसे उत्तर देने के लिए बिताए! बहुत धन्यवाद। – XXL

0

इस के साथ कैसे वॉली HTTPUrlConnection संभालती है और नीति पुन: प्रयास एक मुद्दा है।

यह लिए एक त्वरित सुधार, "HurlStack" वर्ग का विस्तार करने और के 0

public class CustomHurlStack extends HurlStack { 


    public CustomHurlStack(){ 
     super(); 

    } 

    @Override 
    protected HttpURLConnection createConnection(URL url) throws IOException { 
     HttpURLConnection connection = super.createConnection(url); 
     connection.setChunkedStreamingMode(0); 
     return connection; 
    } 

}

संबंधित मुद्दे

 संबंधित मुद्दे