当我们需要调用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标头。
问题:
当添加此标头时?
我的意思是:大胆的线是什么意思?
跨源HTTP请求具有Origin标头。这个标题 为服务器提供请求的来源。这个标题是 受浏览器保护,无法从应用程序代码更改。 实质上,它是发现的origin属性的网络等价物 关于跨文档消息传递中使用的消息事件。原始标题 不同于较旧的referer [sic]标题,因为referer是a 完整的URL包括路径。因为路径可能包含 敏感信息,引用有时不是由浏览器发送的 试图保护用户隐私。 然而,浏览器将永远 必要时发送所需的Origin标题。
答案 0 :(得分:42)
添加此标题后?
在标题的阶段,在发送文档正文之前(open
之后,send
之前)。
当浏览器(支持CORS)正在执行请求时是否添加? (跨域还是非跨域?)
当原点与创建 XMLHttpRequest 的页面不匹配时添加,但也可以在同源请求中发送。
或者当浏览器“看到”请求目标来源与当前来源不同时自动添加...
是
但是,浏览器将始终在必要时发送所需的Origin标头。
这是 XMLHttpRequest 规范的一部分;如果您正在发出跨域请求,请在请求标头中发送额外的标头。这个标题例如是Origin: http://www.stackoverflow.com
并且在没有用户交互的情况下被标准跟踪浏览器附加。
您可以在MozillaWiki's Security section,WHATWG和html5.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标题)。