2012-11-06 14 views
5

के साथ "उत्पत्ति" और "एक्सेस-कंट्रोल-अनुरोध-विधि" शीर्षलेख सेट करना जर्सी क्लाइंट मेरे लिए "मूल" शीर्षलेख स्थापित नहीं कर रहा है और मुझे आश्चर्य है कि मुझे कुछ याद आ रहा है या नहीं।जर्सी क्लाइंट

String origin="http://www.localhost.com"; 
ClientResponse response= webResourceBuilder("my/endpoint") 
      .header("origin" , origin) 
      .header("Access-Control-Request-Method", "POST") 
      .header("xorigin", origin) 
      .header("whatever", "test") 
      .accept("application/xml") 
      .get(ClientResponse.class); 

जब मैं रनटाइम पर निरीक्षण सर्वर साइड पर अनुरोध हेडर, मैं "xorigin" और "जो कुछ भी" हेडर, लेकिन "मूल" और "पहुंच-नियंत्रण-अनुरोध-विधि"

लगता है मैं इन हेडर को कैसे सेट कर सकता हूं?

उत्तर

12

डिफ़ॉल्ट जर्सी क्लाइंट सर्वर को अनुरोध भेजने के लिए HttpURLConnection का उपयोग करता है। HttpUrlConnection कुछ हेडर एक अनुरोध में भेजे जाने के लिए प्रतिबंधित करता है, देखें:

/* 
* Restrict setting of request headers through the public api 
* consistent with JavaScript XMLHttpRequest2 with a few 
* exceptions. Disallowed headers are silently ignored for 
* backwards compatibility reasons rather than throwing a 
* SecurityException. For example, some applets set the 
* Host header since old JREs did not implement HTTP 1.1. 
* Additionally, any header starting with Sec- is 
* disallowed. 
* 
* The following headers are allowed for historical reasons: 
* 
* Accept-Charset, Accept-Encoding, Cookie, Cookie2, Date, 
* Referer, TE, User-Agent, headers beginning with Proxy-. 
* 
* The following headers are allowed in a limited form: 
* 
* Connection: close 
* 
* See http://www.w3.org/TR/XMLHttpRequest2. 
*/ 
private static final boolean allowRestrictedHeaders; 
private static final Set<String> restrictedHeaderSet; 
private static final String[] restrictedHeaders = { 
    /* Restricted by XMLHttpRequest2 */ 
    //"Accept-Charset", 
    //"Accept-Encoding", 
    "Access-Control-Request-Headers", 
    "Access-Control-Request-Method", 
    "Connection", /* close is allowed */ 
    "Content-Length", 
    //"Cookie", 
    //"Cookie2", 
    "Content-Transfer-Encoding", 
    //"Date", 
    //"Expect", 
    "Host", 
    "Keep-Alive", 
    "Origin", 
    // "Referer", 
    // "TE", 
    "Trailer", 
    "Transfer-Encoding", 
    "Upgrade", 
    //"User-Agent", 
    "Via" 
}; 

आपके पास दो विकल्प कैसे इस स्थिति से निपटने के लिए है:

  1. डिफ़ॉल्ट जर्सी ग्राहक के साथ आप एक प्रणाली संपत्ति निर्धारित करने की आवश्यकता

    -Dsun.net.http.allowRestrictedHeaders=true 
    

    जो अनुरोध से प्रतिबंधित शीर्षलेखों को हटाने को दबाता है।

  2. ApacheHttpClient/ApacheHttpClient4 का उपयोग करें जो इस प्रतिबंध को प्रतीत नहीं होता है। सीधे शब्दों में अपनी परियोजना के लिए निम्न निर्भरता से एक जोड़ें:

    <dependency> 
        <groupId>com.sun.jersey.contribs</groupId> 
        <artifactId>jersey-apache-client</artifactId> 
        <version>1.15</version> 
    </dependency> 
    

    या

    <dependency> 
        <groupId>com.sun.jersey.contribs</groupId> 
        <artifactId>jersey-apache-client4</artifactId> 
        <version>1.15</version> 
    </dependency> 
    

    और उसके बाद अपने ग्राहक बनाने की तरह:

    ApacheHttpClient.create(com.sun.jersey.api.client.config.ClientConfig); 
    

    या

    ApacheHttpClient4.create(com.sun.jersey.api.client.config.ClientConfig); 
    
+0

मैं इस पाने के लिए # 1 दृष्टिकोण से काम करने में सक्षम था। मैं वास्तव में # 2 पसंद करता था, लेकिन मुझे लगातार "java.lang.IllegalStateException: सिंगल क्लाइंट कॉनमैनेजर का अमान्य उपयोग: कनेक्शन अभी भी आवंटित" त्रुटियों में दिए गए निर्देशों का पालन करने के बावजूद: http://java.net/jira/browse/JERSEY- 730 – SkP

7

या सिर्फ आपके शीर्षक की स्थापना (यदि आप वैश्विक सेटिंग के रूप में सेट नहीं करना चाहते हैं) से पहले गतिशील इस गुण सेट:

System.setProperty("sun.net.http.allowRestrictedHeaders", "true"); 
+0

यह मेरे लिए काम करता है - मुझे सीएक्सएफ वेब क्लाइंट (3.1.1) के साथ एक ही समस्या हो रही थी जो अनुरोध करने के लिए HttpURLConnection का उपयोग करता है। –

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