XMLHttpRequest 的 getResponseHeader() 的限制?

发布于 2024-12-05 08:19:24 字数 460 浏览 1 评论 0 原文

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

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

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

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

什么给?

I've noticed that the results of and XMLHttpRequest.getResponseHeader() don't always match the real headers returned (if the request is made in a regular manner).

For example, assume I'm making an xhr request for https://foo.example.com/api/resource/100. In Chrome's developer console, under 'Network', I can see the response being made -- I can also see all of the response headers (say, 10). However (copy-pasted console):

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

Are there any restrictions on what headers are available? Is this dependent on the response type? I remember getting a complete set of headers for 404s but just this one for 400s.

What gives?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

や莫失莫忘 2024-12-12 08:19:24

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

客户端.getAllResponseHeaders()

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

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

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

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

在那里您可以读到“跨源资源共享规范过滤标头 过滤getResponseHeader() 对于非 同源 请求。”。并且该规范禁止访问除简单响应头字段<之外的任何响应头字段< /a> (即缓存控制内容语言内容类型过期最后修改,和Pragma):

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

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

The current state of standardizing the XMLHttpRequest API does only restrict the access to the Set-Cookie and Set-Cookie2 header fields:

client.getAllResponseHeaders()

Returns all headers from the response, with the exception of those whose field name is Set-Cookie or Set-Cookie2.

Any other header field should be returned.

But as you’re doing a cross-origin request, the browser needs to implement XMLHttpRequest Level 2 as the original XMLHttpRequest does only allow same-origin requests:

The XMLHttpRequest Level 2 specification enhances the XMLHttpRequest object with new features, such as cross-origin requests […]

There you can read that the “Cross-Origin Resource Sharing specification filters the headers that filters the headers that are exposed by getResponseHeader() for non same-origin requests.”. And that specification forbids access to any response header field other except the simple response header fields (i.e. Cache-Control, Content-Language, Content-Type, Expires, Last-Modified, and Pragma):

User agents must filter out all response headers other than those that are a simple response header […]

E.g. the getResponseHeader() method of XMLHttpRequest will therefore not expose any header not indicated above.

埋情葬爱 2024-12-12 08:19:24

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

It's the Access-Control-Allow-Origin header and the way it allows to prevent which headers are exposed to the browser. Docs at mozilla.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文