web-dev-qa-db-de.com

window.name als Datentransport: ein gültiger Ansatz?

Übersicht und ursprüngliche Frage

window.name ist ein interessantes Biest. Die Beschreibung von MDN weist auf die ursprüngliche Absicht hin:

Der Name des Fensters wird hauptsächlich zum Festlegen von Zielen für Hyperlinks und Formulare verwendet. Windows muss keine Namen haben.

Das heißt, wir können die Konsole in diesem Fenster öffnen und schreiben:

var win = window.open('http://google.com', 'el goog');

... und lass es dann durch den Popup-Blocker, der google.com in einem Fenster mit dem Namen "el goog" öffnen sollte. Ich kann nicht auf die Eigenschaft name von win zugreifen, da dieselbe Origin-Richtlinie gilt. Wenn ich jedoch eine Konsole im neuen Fenster öffne und name eingebe, erhalte ich "el goog".

Wenn ich das Fenster an die Domäne zurückschicke, über die ich es geöffnet habe (in diesem Fall stackoverflow.com), kann ich die Eigenschaft name abrufen, die sich nicht geändert hat.

win.location.replace(location.href);
win.name; // "el goog"

Dies bedeutet, dass wir eine Art domänenübergreifenden Sitzungsspeicher einrichten können, indem wir die Eigenschaft name eines Fensters festlegen.

Wenn google.com geändert den Wert von window.name hätte, bevor das Fenster an die ursprüngliche Domain zurückgesendet wurde, würden wir den neuen Wert anstelle von "el goog" sehen. " Dies könnte als domänenübergreifender Datentransport verwendet werden, ähnlich wie bei JSONP oder CORS.

Ich habe ein bisschen gesucht, um mehr Informationen zu finden, und anscheinend dojo hält es für legitim als Transportmittel. Irgendwie beruhigt mich das aber nicht ganz. Meine Frage ist also, ob seriöse Sites window.name als Datentransport verwenden. Ich würde denken, dass es leicht zu erkennen ist, da ihre Dokumente so etwas wie " 'Rückruf' zu der Abfragezeichenfolge für JSONP hinzufügen oder 'was auch immer' für window.name, hinzufügen = "aber ich habe so etwas noch nie gesehen. Hat jemand dies tatsächlich in freier Wildbahn entdeckt?


Alternative Frage

Es kann sein, dass niemand diese Technik wirklich anwendet; Wenn das stimmt, ist die Frage oben (wie Rob W betont hat) nicht zu beantworten. Meine alternative Frage lautet also: Was sind die Probleme bei diesem Ansatz? Dies könnte erklären, warum es nicht wirklich übernommen wurde.

Meines Erachtens bietet dieser Ansatz gegenüber JSONP mindestens zwei Vorteile.

  • Mit JSONP vertrauen Sie darauf, dass ein Skript von einem fremden Ursprung in Ihrer Domain ausgeführt wird. Mit window.name werden alle von einer böswilligen Site eingeschlossenen Skripts in einer eigenen Domain ausgeführt.

  • Mit JSONP gibt es keine Möglichkeit, Big Data (etwas, das für eine URL zu groß ist) weiterzugeben und keinen HTTP-POST durchzuführen. Mit window.name können wir beliebige Daten beliebiger Größe posten.

Was sind die Nachteile?


Beispielimplementierung

Hier ist ein sehr einfaches Beispiel für eine Client-Implementierung. Dies behandelt keine POST Anfragen, nur 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);

});​

Ich habe eine Geige aufgestellt, um es zu testen hier . Es verwendet dieses Skript als Testserver.

Hier ist ein etwas längeres Beispiel, das POST Anfragen stellen kann: http://jsfiddle.net/n9Wnx/2/


Zusammenfassung

Soweit ich das beurteilen kann, hat sich window.name nicht als Datentransport durchgesetzt. Ich frage mich, ob meine Wahrnehmung korrekt ist (also die ursprüngliche Frage), und wenn ja, frage ich mich, warum dass dies der Fall ist. Ich habe einige Vorteile aufgelistet, die window.name gegenüber JSONP zu haben scheint. Kann jemand einige Nachteile identifizieren, die dazu beigetragen haben könnten, die Übernahme dieser Technik zu verhindern?

Kann mir jemand einen soliden Grund nennen, warum ich winow.name nicht als Datentransport verwenden sollte?

45
Dagg Nabbit

window.name ist als Transport nicht besonders gut, da (AFAIK) keine Ereignisse auslöst, wenn es geändert wird. Eine Anwendung, die window.name als bidirektionalen Kommunikationskanal verwenden wollte, müsste sie daher nach Updates abfragen.

Was Sites angeht, die sie tatsächlich nutzen: Ich habe noch nie etwas davon gehört. Es mag einige geben, aber ich habe nur gehört, dass diese Technik rein theoretisch diskutiert wurde.

6
duskwuff

Genauer gesagt, kann mir jemand einen guten Grund geben, warum ich winow.name nicht als Datentransport verwenden sollte? 

Während window.name ein wahrer Retter sein kann, wenn es um den Transport von Daten über Domänenänderungen geht, liegt der Grund dafür, dass er nicht als realer universeller Datentransportmechanismus verwendet werden kann, daran, dass es keine API zum Speichern und Abrufen von Daten gibt. Zum Beispiel bietet localStoragesetItem, getItem. Eine solche API ist notwendig, um zu ermitteln, wie die Werte tatsächlich gespeichert werden, und um Formatkollisionen zu vermeiden (die entstehen würden, wenn verschiedene Bibliotheken, die auf Ihrer Seite ausgeführt werden, in verschiedenen Formaten speichern würden).

Soweit ich das beurteilen kann, hat window.name sich nicht als Datentransport durchgesetzt. Ich frage mich, ob meine Wahrnehmung richtig ist (also die ursprüngliche Frage) und wenn ja, ich frage mich, warum dies der Fall ist. 

Da window.name - wie in meinem obigen Punkt beschrieben - keine solche Abstraktionsschicht zum Speichern/Abrufen bereitstellt, können Bibliotheken von Drittanbietern nicht wissen, welches Format beim Speichern von Daten in window.main verwendet werden soll, und daher wird window.main niemals verwendet, da dies unzuverlässig ist. Wenn Sie (d. H. Ihr Hauptprogramm) als einziger von window.name lesen oder schreiben, könnten Sie sich entscheiden, Daten im json-Format zu speichern und entsprechend abzuspeichern. Aber was wäre, wenn eine Bibliothek eines Drittanbieters auch etwas speichern/abrufen wollte und sich dafür entschieden hat, json nicht zu verwenden und stattdessen mit einem der anderen zahlreichen Serialisierungsformate ... zusammenzuarbeiten - dies würde Ihr Json-Format versehentlich und definitiv brechen Ärger verursachen.

0
B12Toaster