XMLHttpRequest 的 getResponseHeader() 的限制?

Posted

技术标签:

【中文标题】XMLHttpRequest 的 getResponseHeader() 的限制?【英文标题】:Restrictions of XMLHttpRequest's getResponseHeader()? 【发布时间】:2011-11-19 17:59:05 【问题描述】:

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

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

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

对可用的标头有任何限制吗?这取决于响应类型吗?我记得有一套完整的 404 标头,但只有这个 400 的标头。

什么给了?

【问题讨论】:

如果我在此页面上向http://***.com/ 发出请求,我可以取回所有标题。我不确定如何重现。 我意识到这种模糊性——试图缩小到合适的情况。最初发出的请求是跨域请求,带有 Access-Control-Allow-Origin。请原谅这个问题的匆忙感觉,很快就会详细说明:我现在没有时间进一步调查这个。我希望这是某种我不知道的已知限制。 【参考方案1】:

目前标准化XMLHttpRequest API的状态只限制了对Set-CookieSet-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-ControlContent-LanguageContent-TypeExpiresLast-ModifiedPragma):

用户代理必须过滤掉除简单响应头之外的所有响应头 […]

例如因此,XMLHttpRequest 的 getResponseHeader() 方法不会暴露任何上面未指明的标头。

【讨论】:

好的,谢谢。不过,还有一些谜团。我设置了一个正确的Access-Control-Expose-Headers:——只是发现它只适用于 Gecko,而不适用于 WebKit。 WebKit 高兴地“拒绝获取不安全的标头 (..)”,Gecko 认为没有问题。第二期:getAllResponseHeaders() 谎言。我可以getResponseHeader() 前者未列出为可用的标头。 @maligree: WebKit doesn’t support the Access-Control-Expose-Headers yet. 但是其他问题呢?什么浏览器可以做到这一点? 是的,我偶然发现了那个 bugzilla 问题——但是看到它打开的日期,我对它持保留态度。 并且至于第二个问题,我在 Firefox 6 中看到了这一点。getAllResponseHeaders() 返回"",而getResponseHeader('content-length')getResponseHeader('www-authenticate')(这是我的标题之一设置和Access-Control-Expose-Header'ing) 返回正确的标头值。我宁愿不公开此时使用的 URI,但如果有帮助,我可以稍后设计一个独立的测试用例。 @maligree 你的意思是null 对吧? cfbugzilla.mozilla.org/show_bug.cgi?id=608735【参考方案2】:

这是Access-Control-Allow-Origin 标头,它允许防止哪些标头暴露给浏览器。 Docs at mozilla.

【讨论】:

以上是关于XMLHttpRequest 的 getResponseHeader() 的限制?的主要内容,如果未能解决你的问题,请参考以下文章

XMLHttpRequest 对象

XMLHTTPRequest 错误:不推荐使用主线程上的同步 XMLHttpRequest ...(SoundCloud API)

XMLHttpRequest 对象

02AJAX XMLHttpRequest对象

AJAX - 创建 XMLHttpRequest 对象

基于XMLHttpRequest的ajax简介