Javascript window.name作为数据传输:有效方法?

Javascript window.name作为数据传输:有效方法?,javascript,same-origin-policy,Javascript,Same Origin Policy,概述和原始问题 他是一只有趣的野兽。MDN的描述暗示了其初衷: 窗口的名称主要用于设置超链接和表单的目标。Windows不需要有名称 因此,这意味着我们可以在这个窗口中打开控制台,并写入: var win = window.open('http://google.com', 'el goog'); …然后让它通过弹出窗口拦截器,该拦截器应在名为“el goog”的窗口中打开google.com。由于同源策略,我无法访问win的name属性,但如果我在新窗口中打开控制台并键入name,我将得到“

概述和原始问题

他是一只有趣的野兽。MDN的描述暗示了其初衷:

窗口的名称主要用于设置超链接和表单的目标。Windows不需要有名称

因此,这意味着我们可以在这个窗口中打开控制台,并写入:

var win = window.open('http://google.com', 'el goog');
…然后让它通过弹出窗口拦截器,该拦截器应在名为“el goog”的窗口中打开google.com。由于同源策略,我无法访问
win
name
属性,但如果我在新窗口中打开控制台并键入
name
,我将得到
“el goog”

如果我将窗口发送回我打开它的域(在本例中是stackoverflow.com),我可以获得
name
属性,并且它没有改变

win.location.replace(location.href);
win.name; // "el goog"
这意味着我们可以通过设置窗口的
name
属性来拥有一种跨域会话存储

如果google.com在将窗口发送回原始域之前更改了
window.name
的值,我们将看到新值而不是“el-goog”。这可以用作跨域数据传输,在实用性上类似于JSONP或CORS

我做了一些搜索,试图找到更多的信息,显然dojo是一种交通工具。然而,不知何故,这并不能让我完全放心。所以我的问题是,有没有信誉良好的网站使用
window.name
作为数据传输?我认为这很容易被发现,因为他们的文档会说“在JSONP的查询字符串中添加'callback',或者在window.name中添加'whatever',但我从未见过这样的事情。真的有人在野外发现过吗


备选问题

可能没有人真正使用这种技术;如果这是真的,那么(正如Rob W指出的)上述问题是无法回答的。那么,我的另一个问题是,这种方法有什么问题?这可能有助于解释为什么它没有真正被采用

在我看来,与JSONP相比,这种方法至少有两个好处

  • 使用JSONP,您可以信任来自国外的脚本在您的域上运行。使用
    window.name
    ,恶意站点包含的任何脚本都将在其自己的域上运行

  • 使用JSONP,无法传递大数据(对于URL来说太大的数据),也无法生成HTTP POST。使用
    window.name
    ,我们可以发布任意大小的数据

缺点是什么


实施示例

下面是一个非常简单的客户机实现示例。这不处理POST请求,只处理GET

function fetchData(url, callback) {
    var frame = document.createElement('iframe');
    frame.onload = function() {
        frame.onload = function() {
            callback(frame.contentWindow.name);
            frame.parentNode.removeChild(frame);
        }
        frame.src = 'about:blank';
    }
    frame.src = url;
    document.body.appendChild(frame);
}

// using it

fetchData('http://somehost.com/api?foo=bar', function(response) {

    console.log(response);

});​
我装了一把小提琴来测试一下。 它用作测试服务器

下面是一个可以发出POST请求的稍长的示例:


摘要

据我所知,
window.name
还没有作为数据传输流行起来。我想知道我的看法是否正确(这就是最初的问题),如果是,我想知道为什么会这样。我列出了
window.name
与JSONP相比的一些优势。有人能找出一些可能有助于阻止采用这种技术的缺点吗


更重要的是,有谁能给我一个坚实的理由,为什么我不应该使用
winow.name
作为数据传输?

window.name
作为传输并不特别好,因为(好吧)它在更改时不会触发任何事件。因此,试图使用
window.name
作为双向通信通道的应用程序必须轮询它以获取更新

至于实际使用它的网站:我从来没有听说过。可能会有一些,但我只听过在纯理论意义上讨论这种技术

更重要的是,有谁能给我一个不应该使用winow.name作为数据传输的确切理由吗

当涉及跨域更改传输数据时,
window.name
可能是一个真正的救世主,但它不能用作真正的通用数据传输机制的原因是缺少存储和检索数据的api。例如,
localStorage
提供了
setItem
getItem
。这样的api对于从实际存储值的方式中抽象出来并防止格式冲突(如果运行在您这边的不同库以不同格式存储,则会出现格式冲突)是必要的

据我所知,window.name还没有作为数据传输流行起来。我想知道我的看法是否正确(这就是最初的问题),如果是,我想知道为什么会这样


由于
window.name
没有提供这样的存储/检索抽象层–如我在上面的观点所述–第三方图书馆无法知道在
window.main
中存储数据时使用哪种格式,因此永远不会使用
window.main
,因为它不可靠。如果只有您(即您的主程序)读取或写入
window.name
,您可以决定以json格式存储数据,并相应地存储/检索数据。但是,如果第三方库也希望存储/检索某些内容,但它决定不使用json,而是使用另一个。。。这会意外破坏您的json格式,肯定会造成麻烦。

@RobW类似于“是的,blahboop.com API将使用JSONP或window.name…响应请求”,其中blahboop.com是人们实际使用的东西。给这个想法增加一些合法性的东西。我很确定我可以处理这个实现,但是我认为看到一个合法的站点使用这种技术可能会提高可靠性(至少这种行为在将来不太可能被删除),知道某个站点使用这种技术并不会使这种方法更强大/有效。假设答案是“谷歌u”