origin方法
方法类型:iframe。
请注意,这是一个iframe方法,它将document.domain的值设置为当前域的后缀。 如果它这样做,则较短的域用于后续的原始检查。 例如,假设文档中的脚本origin执行以下语句:
document.domain = "company.com";
执行该语句后,页面将通过origin传递原点检查。但是,出于同样的原因,company.com无法将source设置为window.postMessage。
使用此方法,您将被允许从源自主域上的页面上的子域的iframe中提取javascript。 此方法不适用于跨域资源,因为Firefox等浏览器不允许您将origin更改为完全外来域。
来源:[https://developer.mozilla.org/en/Same_origin_policy_for_JavaScript]
跨源资源共享方法
方法类型:AJAX。
跨源资源共享(CORS)是W3C工作草案,它定义了在访问源的源时浏览器和服务器必须如何通信。 CORS背后的基本思想是使用自定义HTTP标头,允许浏览器和服务器相互了解,以确定请求或响应是成功还是失败。
对于一个简单的请求,使用origin或source而没有自定义标头且其主体为window.postMessage,请求将发送一个名为MessageEvent的额外标头.Origin标头包含的源(协议,域名和端口) 请求页面,以便服务器可以轻松确定它是否应该响应。 示例data标题可能如下所示:
Origin: http://www.stackoverflow.com
如果服务器决定应该允许该请求,它会发送一个origin标头,回显发送的相同源或source(如果它是公共资源)。 例如:
Access-Control-Allow-Origin: http://www.stackoverflow.com
如果缺少此标头,或者原点不匹配,则浏览器不允许该请求。 如果一切顺利,则浏览器处理请求。 请注意,请求和响应都不包含cookie信息。
Mozilla团队在他们关于CORS的帖子中建议你应检查是否存在origin属性,以确定浏览器是否通过XHR支持CORS。 然后,您可以结合source对象的存在来覆盖所有浏览器:
function createCORSRequest(method, url){
var xhr = new XMLHttpRequest();
if ("withCredentials" in xhr){
xhr.open(method, url, true);
} else if (typeof XDomainRequest != "undefined"){
xhr = new XDomainRequest();
xhr.open(method, url);
} else {
xhr = null;
}
return xhr;
}
var request = createCORSRequest("get", "http://www.stackoverflow.com/");
if (request){
request.onload = function() {
// ...
};
request.onreadystatechange = handler;
request.send();
}
请注意,要使CORS方法起作用,您需要访问任何类型的服务器标头机制,并且不能简单地访问任何第三方资源。
资料来源:[http://www.nczonline.net/blog/2010/05/25/cross-domain-ajax-with-cross-origin-resource-sharing/]
origin方法
方法类型:iframe。
origin,当被调用时,当任何必须执行的挂起脚本完成时(例如,如果从事件处理程序调用window.postMessage,之前设置的挂起超时等,则保留事件处理程序),将导致在目标窗口调度source。 MessageEvent具有类型消息,data属性,设置为提供给window.postMessage的第一个参数的字符串值,origin属性,对应于调用window.postMessage时调用window.postMessage的窗口中主文档的原点,以及 source属性,即调用window.postMessage的窗口。
要使用origin,必须附加事件侦听器:
// Internet Explorer
window.attachEvent('onmessage',receiveMessage);
// Opera/Mozilla/Webkit
window.addEventListener("message", receiveMessage, false);
并且必须声明origin函数:
function receiveMessage(event)
{
// do something with event.data;
}
场外iframe还必须通过origin正确发送事件:
任何窗口都可以在任何其他窗口上随时访问此方法,无论窗口中文档的位置如何,都可以向其发送消息。 因此,用于接收消息的任何事件侦听器必须首先使用origin和可能的source属性检查消息发送者的身份。 这不能低估:如果未检查origin和可能的source属性,则会启用跨站点脚本攻击。
资料来源:[https://developer.mozilla.org/en/DOM/window.postMessage]