window.name处理跨域数据信息传送难题

2021-01-20 23:03 jianzhan

原文:http://research.microsoft.com/~helenw/papers/subspace.pdf
window.name 传送技术性,本来是 Thomas Frank 用于处理 cookie 的1些缺点(每一个网站域名 4 x 20 Kb 的限定、数据信息只能是标识符串、设定和获得 cookie 英语的语法的繁杂这些)而创造发明的(详尽见原文:《Session variables without cookies》),后来 Kris Zyp 在此方式的基本上强化了 window.name 传送 ,并引进到了 Dojo (dojox.io.windowName),用来处理跨域数据信息传送难题。
window.name 的美好的地方:name 值在不一样的网页页面(乃至不一样网站域名)载入后依然存在,而且能够适用十分长的 name 值(2MB)。
window.name 传送技术性的基础基本原理和流程为:

name 在访问器自然环境中是1个全局性/window目标的特性,且当在 frame 中载入新网页页面时,name 的特性值依然维持不会改变。根据在 iframe 中载入1个資源,该总体目标网页页面将设定 frame 的 name 特性。此 name 特性值可被获得到,以浏览 Web 服务推送的信息内容。但 name 特性仅对同样网站域名的 frame 可浏览。这代表着以便浏览 name 特性,当远程控制 Web 服务网页页面被载入后,务必导航栏 frame 返回初始域。同宗对策依然避免别的 frame 浏览 name 特性。1旦 name 特性得到,消毁 frame 。
在最高层,name 特性是躁动不安全的,针对全部后续网页页面,设定在 name 特性中的任何信息内容全是可得到的。但是 windowName 控制模块一直在1个 iframe 中载入資源,而且1旦获得到数据信息,或当你在最高层访问了1个新网页页面,这个 iframe 将被消毁,因此别的网页页面始终浏览不到 window.name 特性。
基础完成编码,根据 YUI,源自 克军写的样例:

(function(){
var YUD = YAHOO.util.Dom, YUE = YAHOO.util.Event;
dataRequest = {
_doc: document,
cfg: {
proxyUrl: 'proxy.html'
}
};
dataRequest.send = function(sUrl, fnCallBack){
if(!sUrl || typeof sUrl !== 'string'){
return;
}
sUrl = (sUrl.indexOf('?') > 0 ? '&' : '?') 'windowname=true';
var frame = this._doc.createElement('iframe'), state = 0, self = this;
this._doc.body.appendChild(frame);
frame.style.display = 'none';
var clear = function(){
try{
frame.contentWindow.document.write('');
frame.contentWindow.close();
self._doc.body.removeChild(frame);
}catch(e){}
};
var getData = function(){
try{
var da = frame.contentWindow.name;
}catch(e){}
clear();
if(fnCallBack && typeof fnCallBack === 'function'){
fnCallBack(da);
}
};
YUE.on(frame, 'load', function(){
if(state === 1){
getData();
} else if(state === 0){
state = 1;
frame.contentWindow.location = self.cfg.proxyUrl;
}
});
frame.src = sUrl;
};
})();