Vue d'ensemble et la question d'origine
de la fenêtre.le nom est un intéressant bête. MDN, description des indications à l'intention originale:
Le nom de la fenêtre est utilisé principalement pour l'établissement de cibles pour les liens hypertexte et les formes. Windows n'avez pas besoin d'avoir des noms.
Donc, cela signifie que nous pouvons ouvrir la console dans cette fenêtre, et d'écrire:
var win = window.open('http://google.com', 'el goog');
...et laissez-le ensuite à travers le bloqueur de pop-up, qui doit ouvrir google.com dans une fenêtre nommée "el goog." Je ne peux pas accéder à l' name
de la propriété de l' win
en raison de la même origine, mais si j'ouvre une console dans la nouvelle fenêtre et tapez name
, je serai "el goog"
.
Si j'envoie la fenêtre sur le domaine je l'ai ouvert à partir de (dans ce cas stackoverflow.com), je peux obtenir l' name
de la propriété, et il n'a pas changé.
win.location.replace(location.href);
win.name; // "el goog"
Cela signifie que nous pouvons avoir une sorte de cross-domaine de la session de banque par le réglage de l' name
de la propriété d'une fenêtre.
Si google.com a changé la valeur de window.name
avant que la fenêtre a été renvoyé au domaine d'origine, nous verrions la nouvelle valeur à la place de "el goog." Il pourrait être utilisé comme une croix-des données dans le domaine des transports, similaire dans l'utilitaire de JSONP ou de la SCRO.
J'ai fait un peu de recherche pour trouver plus d'info, et apparemment dojo pense qu'il est légitime de transport. D'une certaine manière, cependant, qui n'est pas complètement me rassurer. Donc ma question est, sont l'un des sites dignes de confiance à l'aide de window.name
comme le transport de données? Je pense qu'il serait facilement repérable, car leurs docs dirait quelque chose comme "ajouter "de rappel" pour la chaîne de requête pour JSONP, ou ajouter un 'tout' pour la fenêtre.nom de," mais je n'ai jamais rien vu de pareil. Quelqu'un a effectivement repéré ce dans la nature?
Suppléant question
Il peut être le cas que personne n'est vraiment à l'aide de cette technique, si c'est vrai alors (comme Rob W a souligné la question ci-dessus est sans réplique. Donc, mon suppléant question est, quels sont les problèmes avec cette approche? Cela peut aider à expliquer pourquoi il n'a pas vraiment été adopté.
Comme je le vois, il y a au moins deux avantages à cette approche plus JSONP.
Avec JSONP, vous faites confiance à un script à partir d'une origine étrangère à s'exécuter sur votre domaine. Avec
window.name
, tous les scripts inclus par un site malveillant serait de fonctionner sur leur propre domaine.Avec JSONP, il n'y a pas de moyen de passer dans le big data (quelque chose de trop gros pour une URL), et aucun moyen de faire un HTTP POST. Avec
window.name
,, nous pouvons publier des données arbitraires de toute taille.
Quels sont les inconvénients?
Exemple de mise en œuvre
Voici un exemple très simple de mise en œuvre du client. Cela ne veut pas gérer les requêtes POST, seulement OBTENIR.
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);
});
J'ai mis en place un violon pour le tester ici. Il utilise ce script en tant que serveur de test.
Voici un peu plus de exemple qui peut faire des requêtes POST: http://jsfiddle.net/n9Wnx/2/
Résumé
Aussi loin que je peux dire, window.name
n'a pas pris sur les données de transport. Je me demande si ma perception est exacte (et donc la question d'origine) et si oui, je me demande pourquoi c'est le cas. J'ai énuméré quelques-uns des avantages qu' window.name
semble avoir plus de JSONP. Quelqu'un peut-il identifier certains inconvénients qui pourraient avoir contribué à empêcher l'adoption de cette technique?
Plus au point, quelqu'un peut-il me donner une solide raison pour laquelle je ne devrais pas utiliser winow.name
comme le transport de données?