2010-03-08 9 views
18

Je rencontre des problèmes de politique d'origine identique en Javascript. J'ai lu à propos d'une solution de contournement pour cela à l'aide de la variable document.domain, mais je ne peux pas obtenir la solution de contournement pour fonctionner. La solution de contournement est que vous êtes censé être en mesure de définir document.domain à 'example.com' de sorte que si vous exécutez le code à partir de foo.example.com il peut charger des données via XHR à partir de bar.example.com.Solution de contournement de stratégie d'origine identique à l'aide de document.domain en Javascript

Détails sur la solution de contournement sont ici:

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

Mon exemple de code - qui ne produit pas les résultats escomptés - est exécuté à partir d'une URL comme 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> 

La sortie de ce code:

 
Result: 
Error loading page: 0 

Si je change url en 'http://foo.example.com/', tout fonctionne correctement. Y a-t-il un bug dans mon exemple de code?

Je ne veux pas utiliser de proxy car ils sont plus lents, moins efficaces et augmenteront le trafic sur notre serveur Web. Ce serait vraiment cool si cette solution de contournement fonctionnait réellement. Est-ce que cette solution de rechange "tarte dans le ciel"?

Répondre

3

Depuis que Mic a répondu pourquoi cela ne fonctionne pas, j'ai pensé que je partagerais la solution à "comment" faire du travail inter-domaine. Voir mon article SO here.

+0

Merci j0rd4n, c'est exactement le genre de solution non-proxy que je cherchais, même si j'abusais le mauvais arbre avec document.domain. J'ai trouvé un peu plus d'informations sur le système qu'ils appellent JSONP et comment jQuery a cette fonctionnalité intégrée, ce qui est en dehors de la portée de ma question, mais néanmoins intéressant: http://www.ibm.com/developerworks/library/wa-aj-jsonp1/ – Rubix

+0

Le processus que j'ai mentionné utilise JSONP mais il le fait dans un sens manuel. jquery va gérer la "réception" du JSONP dans le DOM javascript, mais il vous reste à fournir un service qui renvoie le texte JSONP. À la fin de la journée, la page de votre serveur doit renvoyer un fichier JSONP formaté. Votre JavaScript (que ce soit jquery, ext-js, etc.) doit faire l'appel pour exécuter le script à l'intérieur d'une balise de script. –

21

document.domain permet la communication entre les trames/iframes. Pas 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> 

Si vous supprimez la ligne avec document.domain, la lecture du contenu du contentWindow jetteront l'erreur même politique Origine.

+0

Je l'ai essayé. La définition de document.domain dans le chrome renvoie une erreur réseau. Les outils des développeurs traitaient du même problème de politique d'origine. – user2284570

+1

Avez-vous essayé de définir 'document.domain' à la même valeur dans le domaine parent et le sous-domaine? Sinon, cela provoque une erreur. – Mic

+0

Je suppose que c'est parce que l'iframe est complètement un domaine différent. – user2284570