2011-09-18 73 views
26

我注意到和XMLHttpRequest.getResponseHeader()的結果並不總是匹配返回的真實標題(如果請求是以常規方式進行的)。XMLHttpRequest的getResponseHeader()的限制?

例如,假設我正在對https://foo.example.com/api/resource/100發出xhr請求。在Chrome的開發者控制檯中,在「網絡」下,我可以看到正在做出的響應 - 我還可以看到所有響應標頭(例如10)。然而(複製粘貼的控制檯):

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

對可用標頭有什麼限制嗎?這是依賴於響應類型嗎?我記得爲404s獲得了一套完整的標題,但只有這個標題爲400s。

什麼給?

+0

如果我向'http:// stackoverflow發出請求。com /'在這個頁面上,我可以獲取所有標題。我不知道如何重現。 – pimvdb

+0

我知道模糊 - 試圖縮小到合適的情況。最初的請求是使用Access-Control-Allow-Origin的跨源請求。請原諒這個問題的匆忙感覺,很快就會詳述:目前我沒有時間進一步調查。我希望這是某種我不知道的已知限制。 – maligree

回答

34

規範XMLHttpRequest API並不只限制訪問的Set-Cookie的Set-COOKIE2報頭字段的當前狀態:

客戶 .getAllResponseHeaders()

返回響應中的所有標頭,但字段名稱爲Set-CookieSet-Cookie2的標頭除外。

應該返回任何其他頭字段。

但是當你正在做一個跨源請求,瀏覽器需要實現XMLHttpRequest Level 2作爲原始的XMLHttpRequest並只允許同一來源的請求:

當XMLHttpRequest級別2規範增強了XMLHttpRequest對象與新的功能,如跨域請求[...]

在那裏,你可以讀到,「Cross-Origin Resource Sharing specification過濾器能過濾由getResponseHeader()same-origin請求露出頭的頭。」和說明書中禁止訪問除了simple response header fields其他任何響應報頭字段(即緩存控制內容語言內容類型過期上次修改,和附註):

用戶代理必須過濾掉比那些簡單的響應報頭[...]

例如其他所有響應頭XMLHttpRequest的getResponseHeader()方法因此不會公開任何未在上面指出的頭部。

+1

對,謝謝。儘管如此,我仍然還有一些謎團。我已經設置了一個正確的'Access-Control-Expose-Headers:' - 只是爲了發現它只適用於Gecko,而不適用於WebKit。 WebKit樂於「拒絕獲取不安全的標題(..)」,Gecko認爲沒有問題。第二個問題:'getAllResponseHeaders()'在於。我可以'getResponseHeader()'標題,前者沒有列出可用。 – maligree

+0

@maligree:[WebKit不支持* Access-Control-Expose-Headers *](https://bugs.webkit.org/show_bug.cgi?id=41210)但是另一個問題呢?什麼瀏覽器呢? – Gumbo

+0

是的,我偶然發現了這個bugzilla問題 - 但看到它被打開的日期,我拿着一粒鹽。 *和*關於第二個問題,我在Firefox 6中看到了這一點。'getAllResponseHeaders()'返回'「」',而getResponseHeader('content-length')''或'getResponseHeader('www-authenticate' )'(這是我設置的標題之一,並且'Access-Control-Expose-Header''ing)返回適當的標題值。我寧願不公開此時使用的URI,但如果它有幫助,我可以稍後再設計一個單獨的測試用例。 – maligree

3

這是Access-Control-Allow-Origin標題和它允許防止哪些標題暴露給瀏覽器的方式。 Docs at mozilla