2017-01-17 10 views
5

पास नहीं कर रहा है मैं वसंत के RestTemplate का उपयोग कर एक क्रॉस-मूल अनुरोध करने की कोशिश कर रहा हूं। संचार दो स्प्रिंग-बूट वेबपैप्स के बीच किया जाता है, दोनों स्थानीयहोस्ट पर चल रहे हैं लेकिन अलग-अलग बंदरगाह पर चल रहे हैं। मैं क्या है:RestTemplate मूल शीर्षक

HttpHeaders httpHeaders = new HttpHeaders(); 
httpHeaders.setOrigin("http://localhost:8083"); 
httpHeaders.add("Authorization", token); 

HttpEntity<Void> httpEntity = new HttpEntity<>(httpHeaders); 

ParameterizedTypeReference<List<MyObj>> beanType = new ParameterizedTypeReference<List<MyObj>>() {}; 
ResponseEntity<List<MyObj>> list = restTemplate.exchange(serviceURL, HttpMethod.GET, httpEntity, beanType); 

कॉल निष्पादित, "प्राधिकरण" शीर्षक ठीक पारित कर दिया है, लेकिन कोई फर्क नहीं पड़ता कि मैं क्या करने की कोशिश, प्राप्त पक्ष पर नहीं "उत्पत्ति" शीर्षक है। जब मैं किसी अन्य टूल (सोपयूआई, रेस्ट क्लाइंट क्रोम प्लगइन इत्यादि) का उपयोग करके सिमिलर अनुरोध बनाता हूं तो हेडर पास किया जाता है जैसे ही मैं इसे प्रदान करता हूं।

मैं javax.servlet.Filter के कार्यान्वयन का उपयोग कर रहा साथ प्राप्त ओर सभी हेडर प्रिंट करने के लिए:

public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) 
     throws IOException, ServletException { 
    HttpServletRequest request = (HttpServletRequest) req; 
    HttpServletResponse response = (HttpServletResponse) res; 
    Enumeration<String> headerNames = request.getHeaderNames(); 
    while (headerNames.hasMoreElements()) { 
     String headerName = headerNames.nextElement(); 
     log.info(headerName + ": " + request.getHeader(headerName)); 
    } 
} 

जब RestTemplate का उपयोग कर क्यों मूल हैडर पारित नहीं किया जाता है?

उत्तर

7

वही समस्या थी जिसे मैंने ठीक करने के लिए एक शताब्दी बिताई थी। डिफ़ॉल्ट रूप से RestTemplate मानक JDK सुविधाओं पर निर्भर करता है HTTP कनेक्शन स्थापित करने के लिए:

मूल कारण RestTemplate प्रलेखन

नोट से इस लाइन है।

आप जावा में HttpUrlConnection वर्ग के स्रोत कोड की जांच, तो आप कोड के ब्लॉक नीचे मिल जाएगा, और हैडर Origin प्रतिबंधित हेडर कि परिवर्तन न करे में से एक है:

/* 
* 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" 
}; 

वहाँ एक आसान है इस समस्या को ठीक है, बस एक JVM तर्क

-Dsun.net.http.allowRestrictedHeaders=true 

स्थापित करने के लिए या अपने कोड में एक पंक्ति जोड़ें

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

जो प्रतिबंध को दबाता है।

0

एक ही समस्या थी। मुझे पता चला है कि अपाचे http क्लाइंट में यह समस्या नहीं है और 'उत्पत्ति' के साथ अनुरोध भेजता है: http://hc.apache.org/

HttpOptions httpOptions = new 
HttpOptions(url) 
httpOptions.setHeader("Origin", "test") 
httpOptions.setHeader("Content-Type", "application/json") 
BasicHttpClientConnectionManager manager = new 
BasicHttpClientConnectionManager() 
HttpClient client = new MinimalHttpClient(manager) 
client.execute(httpOptions) 
संबंधित मुद्दे