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-Cookie和Set-Cookie2头域的访问:
客户端.getAllResponseHeaders()
返回响应中的所有标头,字段名称为
Set-Cookie
或Set-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):
用户代理必须过滤掉除简单响应头之外的所有响应头 […]
例如因此,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 ...(SoundCloud API)