2011-09-18 16 views
26

मैंने देखा है कि XMLHttpRequest.getResponseHeader() के परिणाम हमेशा वास्तविक हेडर से मेल नहीं खाते हैं (यदि अनुरोध नियमित रूप से किया जाता है)।XMLHttpRequest के getResponseHeader() के प्रतिबंध?

उदाहरण के लिए, मान लीजिए कि मैं https://foo.example.com/api/resource/100 के लिए अनुरोध कर रहा हूं। क्रोम के डेवलपर कंसोल में, 'नेटवर्क' के तहत, मैं प्रतिक्रिया को देख सकता हूं - मैं सभी प्रतिक्रिया शीर्षलेख भी देख सकता हूं (कहें, 10)। हालांकि (कॉपी-पेस्ट कंसोल):

> response 
    XMLHttpRequest 
> response.getAllResponseHeaders(); 
    "content-type: text/html 
    " 

क्या हेडर उपलब्ध हैं पर कोई प्रतिबंध है? क्या यह प्रतिक्रिया प्रकार पर निर्भर है? मुझे 404 के लिए हेडर का पूरा सेट मिलना याद है, लेकिन यह सिर्फ 400 के लिए है।

क्या देता है?

+0

यदि मैं 'http: // stackoverflow का अनुरोध करता हूं।com/'इस पृष्ठ पर, मैं सभी शीर्षकों को वापस पाने में सक्षम हूं। मुझे यकीन नहीं है कि पुन: उत्पन्न कैसे करें। – pimvdb

+0

मुझे अस्पष्टता के बारे में पता है - एक उपयुक्त मामले को कम करने की कोशिश कर रहा हूं। मूल अनुरोध अनुरोध-नियंत्रण-अनुमति-उत्पत्ति के साथ क्रॉस-मूल अनुरोध है। प्रश्न की बढ़ी भावना से क्षमा करें, जल्द ही विस्तारित होगा: इस समय मेरी जांच करने के लिए मेरे पास समय नहीं था। मैं उम्मीद कर रहा था कि यह किसी तरह का ज्ञात प्रतिबंध था जिसे मैं अनजान हूं। – maligree

उत्तर

34

XMLHttpRequest API मानकीकरण केवल सेट कुकी और सेट Cookie2 शीर्ष लेख फ़ील्ड के लिए उपयोग को प्रतिबंधित करता है की वर्तमान स्थिति:

ग्राहक .getAllResponseHeaders()

प्रतिक्रिया से सभी शीर्षलेख लौटाता है, जिनके क्षेत्र का नाम Set-Cookie या Set-Cookie2 है।

कोई अन्य शीर्षलेख फ़ील्ड वापस किया जाना चाहिए।

XMLHttpRequest स्तर 2 विनिर्देशन के साथ XMLHttpRequest ऑब्जेक्ट को बढ़ाता है:

लेकिन जैसा कि आप एक क्रॉस-मूल अनुरोध कर रहे हैं, ब्राउज़र XMLHttpRequest Level 2 को लागू करने के रूप में मूल XMLHttpRequest केवल एक ही मूल के अनुरोध की अनुमति नहीं है की जरूरत है इस तरह के पार मूल अनुरोध [...]

वहाँ आप पढ़ सकते हैं कि "Cross-Origin Resource Sharing specification हेडर कि हेडर कि गैर same-origin अनुरोधों के लिए getResponseHeader() से संपर्क में हैं फिल्टर फिल्टर।" के रूप में नई सुविधाओं,। और वह विनिर्देश कोई प्रतिक्रिया हेडर simple response header fields को छोड़कर अन्य क्षेत्र के लिए उपयोग की मनाही है (यानी कैश-नियंत्रण, सामग्री-भाषा, सामग्री प्रकार, समय-सीमा समाप्त, Last-Modified, और Pragma):

उपयोगकर्ता एजेंट सभी प्रतिक्रिया उन है कि एक साधारण प्रतिक्रिया हेडर [...]

उदाहरण हैं के अलावा अन्य हेडर को फ़िल्टर करना चाहिए XMLHttpRequest की getResponseHeader() विधि इसलिए ऊपर बताए गए किसी भी शीर्षलेख का पर्दाफाश नहीं करेगी।

+1

ठीक है, धन्यवाद। अभी भी कुछ रहस्य बाकी हैं, हालांकि .. मैंने उचित 'एक्सेस-कंट्रोल-एक्सपोज़-हेडर' सेट किया है: - केवल यह पता लगाने के लिए कि यह केवल गेको में काम करता है, न कि वेबकिट। वेबकिट खुशी से "असुरक्षित हेडर (..) पाने के लिए मना कर दिया", गेको को कोई समस्या नहीं दिखती है। दूसरा मुद्दा: 'getAllResponseHeaders() 'झूठ बोलता है। मैं 'getResponseHeader()' शीर्षलेख प्राप्त कर सकता हूं जो पूर्व उपलब्ध नहीं है। – maligree

+0

@maligree: [वेबकिट * एक्सेस-कंट्रोल-एक्सपोज़-हेडर * का समर्थन नहीं करता है।] (Https://bugs.webkit.org/show_bug.cgi?id=41210) लेकिन अन्य मुद्दे के बारे में क्या? वह ब्राउज़र क्या करता है? – Gumbo

+0

हां, मैंने उस बगजिला मुद्दे पर ठोकर खाई है - लेकिन जिस तारीख को खोला गया था, उसे देखते हुए, मैंने इसे नमक के अनाज से लिया। * और * दूसरे मुद्दे के रूप में, मैं इसे फ़ायरफ़ॉक्स 6 में देख रहा हूं। 'GetAllResponseHeaders() 'रिटर्न' "" ', जबकि' getResponseHeader ('content-length')' या 'getResponseHeader ('www-authenticate') '(जो मैं शीर्षलेखों में से एक हूं और 'एक्सेस-कंट्रोल-एक्सपोज़र-हेडर' ') में से एक है, उचित हेडर वैल्यू देता है। मैं इस समय उपयोग किए गए यूआरआई का पर्दाफाश नहीं करना चाहता, लेकिन अगर यह मदद करता है, तो मैं बाद में एक पृथक परीक्षण केस तैयार कर सकता हूं। – maligree

3

यह Access-Control-Allow-Origin शीर्षलेख है और जिस तरह से यह ब्राउज़र को कौन से शीर्षकों को उजागर करने से रोकने की अनुमति देता है। Docs at mozilla