XMLHttpRequest 的 getResponseHeader() 的限制?

IT技术 javascript http xmlhttprequest
2021-02-26 02:40:54

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

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

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

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

是什么赋予了?

2个回答

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

客户端.getAllResponseHeaders()

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

应返回任何其他标头字段。

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

XMLHttpRequest Level 2 规范通过新功能增强了 XMLHttpRequest 对象,例如跨域请求 […]

在那里你可以读到“跨源资源共享规范过滤标头,过滤由getResponseHeader()为非同源请求公开的标头。”。并且该规范禁止访问除简单响应头字段(即Cache-ControlContent-LanguageContent-TypeExpiresLast-ModifiedPragma之外的任何响应头字段

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

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

好的,谢谢。不过,仍然有一些谜团......我已经设置了一个合适的Access-Control-Expose-Headers:- 只是发现它只能在 Gecko 中工作,而不是在 WebKit 中。WebKit 高兴地“拒绝获取不安全的标头 (..)”,Gecko 认为没有问题。第二个问题:getAllResponseHeaders()谎言。我可以getResponseHeader()将前者未列为可用的标题。
2021-05-06 02:40:54
@maligree 你的意思null对吗?参见bugzilla.mozilla.org/show_bug.cgi?id=608735
2021-05-10 02:40:54
@maligree:WebKit 尚不支持Access-Control-Expose-Headers但是另一个问题呢?什么浏览器能做到?
2021-05-16 02:40:54
是的,我偶然发现了那个 bugzilla 问题——但是看到它打开的日期,我对它持保留态度。作为第二个问题,我在Firefox中看到这个6.getAllResponseHeaders()回报"",同时getResponseHeader('content-length')getResponseHeader('www-authenticate')(这是我设置和报头的一个Access-Control-Expose-Header“荷兰国际集团)返回正确的头值。我宁愿不公开此时使用的 URI,但如果有帮助,我可以稍后设计一个独立的测试用例。
2021-05-19 02:40:54

这是Access-Control-Allow-Origin标题以及它允许​​防止哪些标题暴露给浏览器的方式。mozilla 上的文档