Die document.domainMethode
Beachten Sie, dass dies eine iframe-Methode ist, die den Wert von document.domain auf ein Suffix der aktuellen Domäne setzt. In diesem Fall wird die kürzere Domain für nachfolgende Ursprungsprüfungen verwendet. Angenommen, ein Skript im Dokument bei http://store.company.com/dir/other.htmlführt die folgende Anweisung aus:
document.domain = "company.com";
Nachdem diese Anweisung ausgeführt wurde, besteht die Seite die Ursprungsprüfung mit http://company.com/dir/page.html. Doch durch die gleiche Argumentation, company.com konnte nicht gesetzt document.domain zuothercompany.com .
Mit dieser Methode können Sie Javascript von einem Iframe ausführen, der in einer Subdomain auf einer Seite in der Hauptdomain gespeichert ist. Diese Methode eignet sich nicht für domänenübergreifende Ressourcen, da Sie in Browsern wie Firefox keine Änderungen vornehmen könnendocument.domain in eine völlig fremde Domain .
Quelle: https://developer.mozilla.org/en/Same_origin_policy_for_JavaScript
Die Methode zur gemeinsamen Nutzung von Ressourcen zwischen verschiedenen Ursprüngen
Cross-Origin Resource Sharing (CORS) ist ein W3C-Arbeitsentwurf, der definiert, wie Browser und Server beim Zugriff auf Quellen über Ursprünge hinweg kommunizieren müssen. Die Grundidee von CORS besteht darin, benutzerdefinierte HTTP-Header zu verwenden, damit sowohl der Browser als auch der Server genug voneinander wissen, um festzustellen, ob die Anforderung oder Antwort erfolgreich sein oder fehlschlagen sollte.
Für eine einfache Anfrage, die entweder GEToder POSTohne benutzerdefinierte Header verwendet und deren Hauptteil ist text/plain, wird die Anfrage mit einem zusätzlichen Header namens aufgerufen Origin. Der Origin-Header enthält den Ursprung (Protokoll, Domänenname und Port) der anfordernden Seite, sodass der Server leicht bestimmen kann, ob eine Antwort bereitgestellt werden soll oder nicht. Ein Beispielheader Originkönnte folgendermaßen aussehen:
Origin: http://www.stackoverflow.com
Wenn der Server entscheidet, dass die Anforderung zulässig sein soll, sendet er einen Access-Control-Allow-OriginHeader, der denselben Ursprung wiedergibt, der gesendet wurde, oder *wenn es sich um eine öffentliche Ressource handelt. Beispielsweise:
Access-Control-Allow-Origin: http://www.stackoverflow.com
Wenn dieser Header fehlt oder die Ursprünge nicht übereinstimmen, lässt der Browser die Anforderung nicht zu. Wenn alles in Ordnung ist, verarbeitet der Browser die Anfrage. Beachten Sie, dass weder die Anfragen noch die Antworten Cookie-Informationen enthalten.
Das Mozilla-Team schlägt in seinem Beitrag zu CORS vor , das Vorhandensein der withCredentials Eigenschaft zu überprüfen, um festzustellen, ob der Browser CORS über XHR unterstützt. Sie können dann mit der Existenz des XDomainRequestObjekts koppeln , um alle Browser abzudecken:
function createCORSRequest(method, url){
var xhr = new XMLHttpRequest();
if ("withCredentials" in xhr){
xhr.open(method, url, true);
} else if (typeof XDomainRequest != "undefined"){
xhr = new XDomainRequest();
xhr.open(method, url);
} else {
xhr = null;
}
return xhr;
}
var request = createCORSRequest("get", "http://www.stackoverflow.com/");
if (request){
request.onload = function() {
// ...
};
request.onreadystatechange = handler;
request.send();
}
Beachten Sie, dass Sie für die Funktion der CORS-Methode Zugriff auf alle Arten von Server-Header-Mechanismen haben müssen und nicht einfach auf Ressourcen von Drittanbietern zugreifen können.
Quelle: http://www.nczonline.net/blog/2010/05/25/cross-domain-ajax-with-cross-origin-resource-sharing/
Die window.postMessageMethode
window.postMessageWenn ein Aufruf ausgeführt wird, wird a MessageEventim Zielfenster ausgelöst, wenn ein ausstehendes Skript abgeschlossen ist, das ausgeführt werden muss (z. B. verbleibende Ereignishandler, wenn window.postMessagesie von einem Ereignishandler aufgerufen werden, zuvor festgelegte ausstehende Zeitüberschreitungen usw.). Das MessageEventhat die Typnachricht, eine dataEigenschaft, die auf den Zeichenfolgenwert des ersten bereitgestellten Arguments festgelegt ist window.postMessage, eine originEigenschaft, die dem Ursprung des Hauptdokuments in dem Fenster entspricht, window.postMessagedas zum Zeitpunkt des Aufrufs window.postMessageaufgerufen wurde, und eine sourceEigenschaft, aus der das Fenster stammt welches window.postMessageheißt.
Zur Verwendung window.postMessagemuss ein Ereignis-Listener angehängt sein:
// Internet Explorer
window.attachEvent('onmessage',receiveMessage);
// Opera/Mozilla/Webkit
window.addEventListener("message", receiveMessage, false);
Und eine receiveMessageFunktion muss deklariert werden:
function receiveMessage(event)
{
// do something with event.data;
}
Der externe Iframe muss außerdem Ereignisse ordnungsgemäß senden über postMessage:
<script>window.parent.postMessage('foo','*')</script>
Jedes Fenster kann jederzeit auf diese Methode in jedem anderen Fenster zugreifen, unabhängig vom Speicherort des Dokuments im Fenster, um ihm eine Nachricht zu senden. Folglich muss jeder Ereignis-Listener, der zum Empfangen von Nachrichten verwendet wird, zuerst die Identität des Absenders der Nachricht unter Verwendung der Eigenschaften origin und möglicherweise source überprüfen. Dies kann nicht unterschätzt werden: Wenn die Eigenschaften und möglicherweise nicht überprüft werden, werden standortübergreifende Skriptangriffe aktiviert.originsource
Quelle: https://developer.mozilla.org/en/DOM/window.postMessage