從XMLHttpRequest請求響應裡getResponseHeader(header)報錯:Refused to get unsafe header "**" 問題解決

李文楊發表於2017-06-15

問題產生原因:

  • 原因1:W3C的 xhr 標準中做了限制,規定客戶端無法獲取 response 中的 Set-CookieSet-Cookie2這2個欄位,無論是同域還是跨域請求;

  • 原因2:W3C 的 cors 標準對於跨域請求也做了限制,規定對於跨域請求,客戶端允許獲取的response header欄位只限於“simple response header”和“Access-Control-Expose-Headers” (兩個名詞的解釋見下方)。

    "simple response header"包括的 header 欄位有:Cache-Control,Content-Language,Content-Type,Expires,Last-Modified,Pragma;
    "Access-Control-Expose-Headers":首先得注意是"Access-Control-Expose-Headers"進行跨域請求時響應頭部中的一個欄位,對於同域請求,響應頭部是沒有這個欄位的。這個欄位中列舉的 header 欄位就是伺服器允許暴露給客戶端訪問的欄位。

    所以getAllResponseHeaders()只能拿到限制以外(即被視為safe)的header欄位,而不是全部欄位;而呼叫getResponseHeader(header)方法時,header引數必須是限制以外的header欄位,否則呼叫就會報Refused to get unsafe header的錯誤。

    具體可以看看segmentfault的一篇文章:

  • 你真的會使用XMLHttpRequest嗎?

相關文章