2010-03-08 5 views
18

Ich stehe in derselben Richtung in Javascript-Problemen. Ich habe über eine Problemumgehung dafür mithilfe der document.domain-Variable gelesen, aber ich kann die Problemumgehung nicht funktionieren. Die Problemumgehung besteht darin, dass Sie document.domain auf 'example.com' festlegen können, sodass, wenn Sie Code von foo.example.com ausführen, Daten über XHR von bar.example.com geladen werden können.Umgehung derselben Ursprungspunkt-Richtlinie mit document.domain in Javascript

Details zur Abhilfe sind hier:

https://developer.mozilla.org/En/Same_origin_policy_for_JavaScript

Mein Beispiel-Code - die nicht die gewünschten Ergebnisse produziert - wird von einer URL laufen wie http://foo.example.com/:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<body> 
<script> 
document.domain = 'example.com'; 
window.onload = function() { 
    var req = new XMLHttpRequest(); 
    var url = 'http://bar.example.com/'; 
    req.open('GET', url, true); 
    req.onreadystatechange = function (aEvt) { 
     if (req.readyState == 4) { 
      var elem = document.getElementById('result'); 
      if (req.status == 200) { 
       var data = req.responseText; 
      } else { 
       var data = "Error loading page: " + req.status; 
      } 
      elem.innerHTML = data; 
     } 
    }; 
    req.send(null); 
}; 
</script> 
Result:<hr> 
<div id="result"></div> 
</body> 
</html> 

Die Ausgabe von diesem Code:

 
Result: 
Error loading page: 0 

Wenn ich url zu 'http://foo.example.com/' ändere, funktioniert alles korrekt. Gibt es einen Fehler in meinem Beispielcode?

Ich möchte keinen Proxy verwenden, da sie langsamer und weniger effizient sind und den Datenverkehr auf unserem Webserver erhöhen. Es wäre wirklich cool, wenn diese Problemumgehung tatsächlich funktioniert hätte. Ist diese Problemumgehung "Kuchen am Himmel"?

Antwort

3

Da Mic antwortete, warum es nicht funktioniert, dachte ich, ich würde die Lösung teilen, wie man domänenübergreifend arbeiten kann. Siehe meine SO Post here.

+0

Danke j0rd4n, das ist genau die Art von Nicht-Proxy-Lösung, nach der ich gesucht habe, selbst wenn ich mit document.domain den falschen Baum bellte. Ich habe ein wenig mehr Informationen über das Schema gefunden, das sie JSONP nennen, und wie jQuery diese Funktionalität auch eingebaut hat, was außerhalb des Umfangs meiner Frage liegt, aber dennoch interessant ist: http://www.ibm.com/developerworks/library/wa-aj-jsonp1/ – Rubix

+0

Der Prozess, den ich erwähnte, verwendet JSONP, aber es macht es in einem manuellen Sinne. jquery wird das "Empfangen" von JSONP in das JavaScript-DOM übernehmen, aber Sie müssen immer noch einen Dienst bereitstellen, der den JSONP-Text zurückgibt. Am Ende des Tages muss Ihre Serverseite formatiertes JSONP zurückgeben. Ihr JavaScript (ob jquery, ext-js usw.) muss den Aufruf ausführen, um das Skript innerhalb eines Skript-Tags auszuführen. –

21

document.domain ermöglicht die Kommunikation zwischen Frames/iframes. Nicht XHR.

<body> 
<iframe src="http://bar.example.com/"></iframe> 
<script> 
    document.domain = 'example.com'; 
    var ifr = document.getElementsByTagName('IFRAME')[0]; 
    ifr.onload = function(e){ 
     //will log the string "BODY" in the console 
     console.log(ifr.contentWindow.document.body.tagName); 
    }; 
</script> 
</body> 

Wenn Sie die Zeile mit document.domain, Lesen des Inhalts des contentWindow entfernen die Same Origin Policy Fehler werfen.

+0

Ich habe es versucht. Das Festlegen von document.domain in Chrome gibt Netzwerkfehler zurück. Entwickler-Tools haben das gleiche Problem mit der Ursprungsrichtlinie angegeben. – user2284570

+1

Haben Sie versucht, "document.domain" in der übergeordneten Domäne und der Subdomäne auf denselben Wert zu setzen? Wenn nicht, verursacht dies einen Fehler. – Mic

+0

Ich denke, es liegt daran, dass der Iframe vollständig eine andere Domäne ist. – user2284570