使用window.name解决跨域问题

作者:blank 来源:蓝色理想 时间:2008-09-04 12:10:00 

原文:http://research.microsoft.com/~helenw/papers/subspace.pdf

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 值在不同的页面(甚至不同域名)加载后依旧存在,并且可以支持非常长的 name 值(2MB)。

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;
    };
})();

 

标签:浏览器,window,跨域
0
投稿

猜你喜欢

  • python实现的正则表达式功能入门教程【经典】

    2023-11-30 05:38:04
  • vue2.0开发实践总结之疑难篇

    2024-05-02 16:33:28
  • python怎么删除缓存文件

    2022-01-02 03:49:01
  • laravel清除视图缓存的代码

    2023-11-24 14:39:39
  • MAC下Anaconda+Pyspark安装配置详细步骤

    2021-02-11 18:15:51
  • oracle 存储过程和触发器复制数据

    2024-01-19 19:27:46
  • Python语音识别API实现文字转语音的几种方法

    2023-02-17 01:17:00
  • 微信小程序实现图片上传、删除和预览功能的方法

    2023-09-20 08:54:30
  • CI操作cookie的方法分析(基于helper类库)

    2023-11-20 21:59:07
  • PHP7新特性foreach 修改示例介绍

    2024-06-05 09:23:48
  • python中的__slots__使用示例

    2022-05-09 17:50:56
  • 经典分享MySQL的limit查询优化

    2011-05-05 15:47:00
  • python正则表达式去掉数字中的逗号(python正则匹配逗号)

    2023-03-15 20:32:40
  • Python网页解析利器BeautifulSoup安装使用介绍

    2021-06-12 05:00:00
  • z-index在IE中的迷惑

    2007-05-11 16:50:00
  • Windows+Anaconda3+PyTorch+PyCharm的安装教程图文详解

    2021-07-10 03:34:55
  • JS实现在线统计一个页面内鼠标点击次数的方法

    2024-04-28 09:37:35
  • 利用Vite2和Vue3实现网站国际化的全过程

    2023-07-02 17:09:14
  • JS添加删除一组文本框并对输入信息加以验证判断其正确性

    2024-05-03 15:30:54
  • 在Windows下安装配置CPU版的PyTorch的方法

    2023-07-18 15:04:17
  • asp之家 网络编程 m.aspxhome.com