window.name作为数据传输:一个有效的方法?
概述和原始问题
window.name是一个有趣的野兽。 MDN的描述暗示了最初的意图:
窗口的名称主要用于设置超链接和窗体的目标。 Windows不需要有名字。
所以,这意味着我们可以在这个窗口中打开控制台,并写下:
var win = window.open('http://google.com', 'el goog');
…然后让它通过popup式窗口拦截器,该窗口应该在名为“el goog”的窗口中打开google.com。 由于同源策略,我无法访问win
的name
属性,但是如果我在新窗口中打开一个控制台并inputname
,我会得到"el goog"
。
如果我把窗口发回到我打开的域名(在这个例子中是stackoverflow.com),我可以得到name
属性,而且没有改变。
win.location.replace(location.href); win.name; // "el goog"
这意味着我们可以通过设置窗口的name
属性来拥有一种跨域的会话存储。
如果google.com在窗口被发回到原始域之前更改了window.name
的值,我们将看到新值而不是“el goog”。 这可以用作跨域数据传输,类似于JSONP或CORS的实用程序。
我做了一些search试图find更多的信息,显然dojo 认为它是合法的运输。 但不知何故,这并不能完全让我放心。 所以我的问题是,是否有信誉的网站使用window.name
作为数据传输? 我认为这很容易被发现,因为他们的文档会给JSONP的查询string添加“callback”,或者为window.name添加“whatever”,但是我从来没有见过类似的东西。 有没有人真的发现这在野外?
备选问题
可能没有人真正使用这种技术, 如果那是真的(正如Rob W指出的那样),上面的问题是无法回答的。 所以,我的另一个问题是,这种方法有什么问题? 这可能有助于解释为什么它没有被真正采用。
正如我所看到的,与JSONP相比,这种方法至less有两个好处。
-
使用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); });
我已经设置了一个小提琴在这里testing它。 它使用这个脚本作为testing服务器。
这是一个稍长的例子,可以使POST请求: http : //jsfiddle.net/n9Wnx/2/
概要
据我所知, window.name
没有作为一个数据传输。 我想知道我的看法是否准确(因此是原来的问题),如果是的话,我想知道为什么是这样。 我列出了window.name
似乎有JSONP的一些优点。 任何人都可以找出一些可能有助于防止采用这种技术的缺点吗?
更重要的是,任何人都可以给我一个坚实的理由,为什么我不应该使用winow.name
作为数据传输?
window.name
作为传输方式并不是特别好,因为(AFAIK)在改变时不会触发任何事件。 因此,试图使用window.name
作为双向通信通道的应用程序将不得不轮询它的更新。
至于实际使用它的网站:我从来没有听说过。 可能会有一些,但我只听说过纯理论意义上讨论的这种技巧。