CORS 和 Origin 标头?

问题描述 投票:0回答:2

当我们需要调用 Ajax 请求时,我们会这样做:

if(typeof XMLHttpRequest !== 'undefined') xhr = new XMLHttpRequest();
else
{
    var versions = ["Microsoft.XmlHttp",
            "MSXML2.XmlHttp",
            "MSXML2.XmlHttp.3.0",
            "MSXML2.XmlHttp.4.0",
            "MSXML2.XmlHttp.5.0"
    ];
         

我已经知道使用

XMLHttpRequest-2
,我们可以发出跨源请求 并且添加了 Origin 标头。

这个标题是什么时候添加的?

  • 是在浏览器(支持CORS)执行请求(跨域还是非跨域)时添加的?
  • 还是当浏览器“看到”请求目标来源与当前来源不同时自动添加?

我的意思是:粗线是什么意思?

跨源 HTTP 请求具有 Origin 标头。这个标题 向服务器提供请求的来源。这个标题是 受浏览器保护,无法通过应用程序代码进行更改。 本质上,它是找到的原始属性的网络等价物 关于跨文档消息传递中使用的消息事件。原始标头 与旧的 Referer [原文如此] 标头的不同之处在于,Referer 是 包含路径的完整 URL。因为路径可能包含 敏感信息,浏览器有时不发送Referer 试图保护用户隐私。 但是,浏览器总是会 必要时发送所需的 Origin 标头

javascript ajax http http-headers cors
2个回答
51
投票

Origin标题

何时添加此标头?

在标头阶段,发送文档正文之前(

open
之后,
send
之前)。

它是在浏览器(支持 CORS)发出请求时添加的吗? (跨域还是非跨域?)

当源与创建 XMLHttpRequest 的页面不匹配时添加,但也可以在同源请求中发送。

还是当浏览器“看到”请求目标来源与当前来源不同时自动添加...

是的。

但是,浏览器将始终在必要时发送所需的 Origin 标头。

这是 XMLHttpRequest 规范的一部分;如果您发出跨域请求,则在请求标头中会发送额外的标头。该标头例如

Origin: http://www.stackoverflow.com
并由遵循标准的浏览器附加,无需用户交互。


您可以在 MozillaWiki 的安全部分WHATWGhtml5.org 阅读有关该规范的更多信息。它是由(据我所知)FireFox 和 Google Chrome 实现的。我不相信它是 W3C 的一部分。此外,不要假设原始标头是真实的,因为它可以通过修改后的浏览器或其他软件手动设置。


9
投票

当您进行跨域请求时,通常会自动添加原始标头。

为了测试它,我在此页面上打开控制台并发出两个不同的请求:一个针对另一个域,一个针对“/”,只有第一个请求添加了原始标头。

顺便说一句,我正在使用 JQuery,我真的建议您也使用它,以便在跨浏览器上具有相同的行为。

有关该主题的补充信息,请检查:

首先要注意的是,有效的 CORS 请求始终包含 一个 Origin 标头。这个Origin header是浏览器添加的,可以 不受用户控制。该标头的值是方案 (例如 http)、域(例如 bob.com)和端口(仅当它是时才包含) 不是默认端口,例如81) 请求源自何处;为了 示例:http://api.alice.com.

Origin 标头的存在并不一定意味着 request是一个跨域请求。虽然所有跨域请求 将包含 Origin 标头,某些同源请求可能会包含 也有一个。例如,Firefox 不包含 Origin 标头 同源请求。但 Chrome 和 Safari 包含 Origin 标头 在同源 POST/PUT/DELETE 请求上(同源 GET 请求将 没有 Origin 标头)。

来源

© www.soinside.com 2019 - 2024. All rights reserved.