2010-03-08 12 views
18

Mi sto imbattendo in problemi di politica della stessa origine in Javascript. Ho letto su una soluzione alternativa per questo utilizzando la variabile document.domain, ma non riesco a far funzionare la soluzione alternativa. La soluzione è che si dovrebbe essere in grado di impostare document.domain a 'example.com' in modo che se si esegue il codice da foo.example.com è possibile caricare i dati tramite XHR da bar.example.com.Soluzione per la politica della stessa origine che utilizza document.domain in Javascript

dettagli sulla soluzione sono qui:

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

Il mio codice di esempio - che non produce i risultati desiderati - è gestito da un URL del tipo 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> 

L'output di questo codice:

 
Result: 
Error loading page: 0 

Se cambio url in 'http://foo.example.com/', tutto funziona correttamente. C'è un bug nel mio codice di esempio?

Non voglio utilizzare un proxy perché sono più lenti, meno efficienti e aumenteranno il traffico sul nostro server web. Sarebbe davvero bello se questa soluzione funzionasse davvero. Questa soluzione è "torta nel cielo"?

risposta

3

Poiché Mic ha risposto perché non funziona, ho pensato di condividere la soluzione su "come" per eseguire il lavoro su più domini. Vedi il mio post SO here.

+0

Grazie a j0rd4n, questo è esattamente il tipo di soluzione non proxy che stavo cercando, anche se stavo abbaiando dall'albero sbagliato con document.domain. Ho trovato un po 'più di informazioni sullo schema che chiamano JSONP e su come jQuery ha incorporato anche questa funzionalità, che è al di fuori della portata della mia domanda, ma comunque interessante: http://www.ibm.com/developerworks/library/wa-aj-jsonp1/ – Rubix

+0

Il processo che ho citato utilizza JSONP ma lo fa in senso manuale. jquery gestirà la "ricezione" di JSONP nel DOM javascript, ma è comunque necessario fornire un servizio che restituisca il testo JSONP. Alla fine della giornata, la pagina del server deve restituire JSONP formattato. Il tuo JavaScript (che sia jquery, ext-js, ecc.) Deve effettuare la chiamata per eseguire lo script all'interno di un tag script. –

21

document.domain consente la comunicazione tra frame/iframe. Non 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> 

Se si rimuove la linea con document.domain, la lettura del contenuto della contentWindow getterà l'errore Origin Policy Same.

+0

L'ho provato. Impostazione document.domain in chrome restituisce errore di rete. Gli strumenti degli sviluppatori hanno riferito lo stesso problema di politica di origine. – user2284570

+1

Hai provato a impostare 'document.domain' sullo stesso valore sia nel dominio padre che nel sottodominio? In caso contrario, ciò provoca un errore. – Mic

+0

Immagino sia perché l'iframe è completamente un dominio diverso. – user2284570

Problemi correlati