当我们需要调用 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 标头。
这个标题是什么时候添加的?
我的意思是:粗线是什么意思?
跨源 HTTP 请求具有 Origin 标头。这个标题 向服务器提供请求的来源。这个标题是 受浏览器保护,无法通过应用程序代码进行更改。 本质上,它是找到的原始属性的网络等价物 关于跨文档消息传递中使用的消息事件。原始标头 与旧的 Referer [原文如此] 标头的不同之处在于,Referer 是 包含路径的完整 URL。因为路径可能包含 敏感信息,浏览器有时不发送Referer 试图保护用户隐私。 但是,浏览器总是会 必要时发送所需的 Origin 标头。
何时添加此标头?
在标头阶段,发送文档正文之前(
open
之后,send
之前)。
它是在浏览器(支持 CORS)发出请求时添加的吗? (跨域还是非跨域?)
当源与创建 XMLHttpRequest 的页面不匹配时添加,但也可以在同源请求中发送。
还是当浏览器“看到”请求目标来源与当前来源不同时自动添加...
是的。
但是,浏览器将始终在必要时发送所需的 Origin 标头。
这是 XMLHttpRequest 规范的一部分;如果您发出跨域请求,则在请求标头中会发送额外的标头。该标头例如
Origin: http://www.stackoverflow.com
并由遵循标准的浏览器附加,无需用户交互。
您可以在 MozillaWiki 的安全部分、WHATWG 和 html5.org 阅读有关该规范的更多信息。它是由(据我所知)FireFox 和 Google Chrome 实现的。我不相信它是 W3C 的一部分。此外,不要假设原始标头是真实的,因为它可以通过修改后的浏览器或其他软件手动设置。
当您进行跨域请求时,通常会自动添加原始标头。
为了测试它,我在此页面上打开控制台并发出两个不同的请求:一个针对另一个域,一个针对“/”,只有第一个请求添加了原始标头。
顺便说一句,我正在使用 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 标头)。