35

当我们需要调用 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)执行请求时添加的吗?(跨域还是非跨域?)
    • 还是在浏览器“看到”请求目标来源与当前来源不同时自动添加...

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

跨域 HTTP 请求有一个 Origin 标头。此标头为服务器提供请求的来源。此标头受浏览器保护,不能从应用程序代码中更改。本质上,它是在跨文档消息传递中使用的消息事件上发现的原始属性的网络等价物。origin 标头与较旧的referer [sic] 标头的不同之处在于,referer 是一个包含路径的完整 URL。由于路径可能包含敏感信息,因此试图保护用户隐私的浏览器有时不会发送引荐来源网址。但是,浏览器将始终在必要时发送所需的 Origin 标头

4

2 回答 2

48

起源

何时添加此标头?

在标头阶段,在文档正文发送之前(之后open,之前send)。

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

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

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

是的。

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

这是XMLHttpRequest规范的一部分;如果您正在发出跨域请求,则会在请求标头中发送一个额外的标头。例如,此标头Origin: http://www.stackoverflow.com由遵循标准的浏览器附加,无需用户交互。


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

于 2013-04-13T14:06:11.407 回答
9

当您执行跨域请求时,会自动(通常)添加源头。

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

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

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

首先要注意的是,一个有效的 CORS 请求总是包含一个 Origin 标头。这个 Origin 头是浏览器添加的,用户无法控制。该标头的值是发起请求的方案(例如 http)、域(例如 bob.com)和端口(仅当它不是默认端口时才包括在内,例如 81);例如:http ://api.alice.com 。

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

资源

于 2013-04-13T13:51:46.610 回答