XMLHttpRequest的getResponseHeader()的限制?

时间:2011-09-18 16:58:40

标签: javascript http xmlhttprequest

我注意到和XMLHttpRequest.getResponseHeader()的结果并不总是与返回的实际标头匹配(如果请求是以常规方式进行的)。

例如,假设我正在为xhr发出https://foo.example.com/api/resource/100请求。在Chrome的开发者控制台中,在“网络”下,我可以看到正在做出的响应 - 我还可以看到所有响应标头(例如,10)。但是(复制粘贴的控制台):

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

对哪些标头可用有任何限制吗?这取决于响应类型吗?我记得为404s获得了一套完整的标题,但这只是400s的标题。

是什么给出了?

2 个答案:

答案 0 :(得分:36)

标准化XMLHttpRequest API的当前状态仅限制对 Set-Cookie Set-Cookie2 标头字段的访问:

  

<强> 客户端 .getAllResponseHeaders()

     

返回响应中的所有标头,但字段名称为Set-CookieSet-Cookie2的标头除外。

应该返回任何其他标题字段。

但是当您正在进行跨源请求时,浏览器需要实现XMLHttpRequest Level 2,因为原始XMLHttpRequest只允许同源请求:

  

XMLHttpRequest Level 2规范使用新功能增强XMLHttpRequest对象,例如跨源请求[...]

您可以看到“Cross-Origin Resource Sharing specification过滤了标题,这些标题会过滤getResponseHeader()针对非same-origin请求公开的标题。”该规范禁止访问除simple response header fields以外的任何响应头字段(即 Cache-Control Content-Language Content-Type Expires Last-Modified Pragma ):

  

用户代理必须过滤掉除简单响应标题[...]

之外的所有响应标头      

E.g。因此,XMLHttpRequest的getResponseHeader()方法不会暴露任何未在上面指出的标题。

答案 1 :(得分:3)

这是Access-Control-Allow-Origin标头以及它允许​​阻止哪些标头暴露给浏览器的方式。 Docs at mozilla