CORS和Origin标题?

Roy*_*mir 29 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"
    ];
Run Code Online (Sandbox Code Playgroud)

我已经知道,使用XMLHttpRequest-2,我们可以做一个跨源请求该ORIGIN头被添加.

题:

  • 这个标题何时添加?

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

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

跨源HTTP请求具有Origin头.此标头为服务器提供请求的来源.此标头受浏览器保护,无法从应用程序代码更改.本质上,它是在Cross Document Messaging中使用的消息事件中找到的origin属性的网络等价物.origin标头与旧的referer [sic]标头不同,因为referer是包含路径的完整URL.由于路径可能包含敏感信息,因此有时不会通过尝试保护用户隐私的浏览器发送引用.但是,浏览器将始终在必要时发送所需的Origin标头.

Pau*_* S. 45

产地

添加此标题后?

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

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

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

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

是.

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

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


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


Rob*_*flc 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标头).

资源