javascript使用window.name解决跨域问题第1/2页

 更新时间:2008年09月06日 21:51:11   作者:  
window.name 的美妙之处:name 值在不同的页面(甚至不同域名)加载后依旧存在,并且可以支持非常长的 name 值(2MB)。
window.name 传输技术,原本是 Thomas Frank 用于解决 cookie 的一些劣势(每个域名 4 x 20 Kb 的限制、数据只能是字符串、设置和获取 cookie 语法的复杂等等)而发明的(详细见原文:《Session variables without cookies》),后来 Kris Zyp 在此方法的基础上强化了 window.name 传输 ,并引入到了 Dojo dojox.io.windowName),用来解决跨域数据传输问题。
window.name 传输技术的基本原理和步骤为:
name 在浏览器环境中是一个全局/window对象的属性,且当在 frame 中加载新页面时,name 的属性值依旧保持不变。通过在 iframe 中加载一个资源,该目标页面将设置 frame 的 name 属性。此 name 属性值可被获取到,以访问 Web 服务发送的信息。但 name 属性仅对相同域名的 frame 可访问。这意味着为了访问 name 属性,当远程 Web 服务页面被加载后,必须导航 frame 回到原始域。同源策略依旧防止其他 frame 访问 name 属性。一旦 name 属性获得,销毁 frame 。

在最顶层,name 属性是不安全的,对于所有后续页面,设置在 name 属性中的任何信息都是可获得的。然而 windowName 模块总是在一个 iframe 中加载资源,并且一旦获取到数据,或者当你在最顶层浏览了一个新页面,这个 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;
};
})();

相关文章

  • JS利用window.print()实现网页打印功能

    JS利用window.print()实现网页打印功能

    print作为浏览已经比较成熟的技术可以经常被用来打印页面的部分内容。本文将在JS中调用window.print()方法实现网页打印功能,感兴趣的可以跟随小编一起学习一下
    2022-04-04
  • JS错误处理与调试操作实例分析

    JS错误处理与调试操作实例分析

    这篇文章主要介绍了JS错误处理与调试操作,结合实例形式分析了JavaScript错误捕获、处理、调试工具、断点调试等相关操作技巧,需要的朋友可以参考下
    2020-04-04
  • JavaScript运动减速效果实例分析

    JavaScript运动减速效果实例分析

    这篇文章主要介绍了JavaScript运动减速效果,模拟了物体做减速运动的效果,以两个实例形式分析了javascript实现物体做减速运动的实现技巧,涉及javascript动态操作页面元素样式及数学运算的方法,非常简洁实用,需要的朋友可以参考下
    2015-08-08
  • 在微信小程序中使用iconfont的最新图文教程

    在微信小程序中使用iconfont的最新图文教程

    由于微信小程序线上的资源限制了各种接口安全域名,所以在小程序里如果想使用iconfont字体图标就会稍有不同,下面这篇文章主要给大家介绍了关于在微信小程序中使用iconfont的相关资料,需要的朋友可以参考下
    2022-08-08
  • JavaScript中0、空字符串、''0''是true还是false的知识点分享

    JavaScript中0、空字符串、''0''是true还是false的知识点分享

    在本篇文章里小编给大家整理的是JavaScript中0、空字符串、'0'是true还是false的知识点分享,有需要的朋友们参考下。
    2019-09-09
  • JavaScript函数参数的传递方式详解

    JavaScript函数参数的传递方式详解

    本文主要介绍了JavaScript函数参数的传递方式,具有很好的参考价值。下面跟着小编一起来看下吧
    2017-03-03
  • uniapp抖音小程序一键获取用户手机号的示例代码

    uniapp抖音小程序一键获取用户手机号的示例代码

    文章介绍了如何在uniapp抖音小程序中通过点击按钮一键获取用户手机号,encryptedData和iv通过点击按钮回传,后端部分通过解密获取手机号,感兴趣的朋友一起看看吧
    2024-12-12
  • HTML+CSS+JavaScript实现简单日历效果

    HTML+CSS+JavaScript实现简单日历效果

    这篇文章主要为大家详细介绍了HTML+CSS+JavaScript实现简单日历效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-07-07
  • JavaScript循环链表实现方法

    JavaScript循环链表实现方法

    这篇文章主要给大家介绍了关于JavaScript循环链表实现的相关资料,循环链表和单向链表很相似,唯一的区别是循环链表的尾节点是指向头节点的,需要的朋友可以参考下
    2023-07-07
  • webpack几种手动实现HMR的方式

    webpack几种手动实现HMR的方式

    众所周知,在webpack中使用模块热替换(HMR),能够使得应用在运行时,本文就介绍一下如何实现HMR,感兴趣的可以了解一下
    2021-07-07

最新评论