CORS和Origin标题?

时间:2013-04-13 13:29:24

标签: javascript ajax http http-headers cors

当我们需要调用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,我们可以发出原始请求 AND ,即添加ORIGIN标头。

问题:

  • 添加此标头时?

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

我的意思是:大胆的线是什么意思?

  

跨源HTTP请求具有Origin标头。这个标题   为服务器提供请求的来源。这个标题是   受浏览器保护,无法从应用程序代码更改。   实质上,它是发现的origin属性的网络等价物   关于跨文档消息传递中使用的消息事件。原始标题   不同于较旧的referer [sic]标题,因为referer是a   完整的URL包括路径。因为路径可能包含   敏感信息,引用有时不是由浏览器发送的   试图保护用户隐私。 然而,浏览器将永远   必要时发送所需的Origin标题

2 个答案:

答案 0 :(得分:42)

Origin 标题

  

添加此标题后?

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

  

当浏览器(支持CORS)正在执行请求时是否添加? (跨域还是非跨域?)

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

  

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

  

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

这是 XMLHttpRequest 规范的一部分;如果您正在发出跨域请求,请在请求标头中发送额外的标头。这个标题例如是Origin: http://www.stackoverflow.com并且在没有用户交互的情况下被标准跟踪浏览器附加。


您可以在MozillaWiki's Security sectionWHATWGhtml5.org中详细了解规范。它由(我所知道的)FireFox和谷歌Chrome实现。我不相信它是W3C的一部分。进一步不要假设原始标题是真的,因为它可以通过修改的borwsers或其他软件手动设置。

答案 1 :(得分:7)

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

为了测试它,我打开了这个页面上的控制台并提出了两个不同的请求:一个用于另一个域,一个用于'/',只是第一个得到了原始标题。

顺便说一下,我正在使用JQuery,我真的建议你也使用它来实现跨浏览器的相同行为。

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

  

首先要注意的是,有效的CORS请求总是包含   一个Origin标题。此Origin标头由浏览器添加,并且可以   不受用户控制。此标头的值是方案   (例如http),域名(例如bob.com)和端口(仅当它包括时才包含)   不是默认端口,例如81)请求来源;对于   例如:http://api.alice.com

     

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

Source