2012-01-31 12 views
5

Conosco le soluzioni per le chiamate di dominio cross browser. Utilizzare JSONP, effettuare una chiamata proxy o accettare domini sul server. Ho trovato un altro modo strano oggi nella mia azienda.Problemi di dominio incrociato con iframes

Metodo:

stanno cambiando l'host in modo che corrisponda l'ospite di secondo server utilizzando questo -

window.location.host = "xyz.com"; 
      or 
document.domain = "xyz.com"; 

Poi si stanno creando un iframe nascosto e ottenere contenuti in iframe e sostituzione di contenuti da visibile elemento.

Problema:

Funziona con iframe ma se lo faccio chiamata ajax, non funziona. Qualche parola su questo?

+0

Questo suona come un bug o un exploit. In quali browser hai provato questo? – Halcyon

+0

Funziona in IE, Chrome. Non ho eseguito il test in firefox – emphaticsunshine

+3

Non sono sicuro di 'window.location.host', ma la modifica di' document.domain' consente a due diversi sottodomini sullo stesso dominio padre di comunicare. https://developer.mozilla.org/en/Same_origin_policy_for_JavaScript – djd

risposta

3

io non sono un fan di jsonp, si crea l'accoppiamento tra i dati e la presentazione, e così ho studiato questo problema prima, e bene, c'è un trucco che è possibile utilizzare, seguire questa:

diciamo noi avere la finestra di nome principale a e la finestra "bambino" nel iframe chiamato B. a e B devono essere serviti dallo stesso padrone di casa, ma può avere diversi sottodomini, qualcosa di simile:

a è servita da sub1 .example.com

B viene fornito da sub2.example.com

i browser ti consentono di modificare il dominio del documento, ma ti restringono comunque, quindi puoi solo cambiare il dominio rimuovendo i sottodomini fino a raggiungere l'host, quindi in A puoi cambiare il dominio, ad esempio così:

document.domain = "example.com"; 

in B per la prima volta fa una chiamata AJAX al suo dominio (sub2.example.com), poi, dopo la prima richiesta è stata inviata voi cambiare il dominio proprio come in a, in modo che entrambi i documenti hanno la stesso dominio. dal momento che hai fatto una richiesta al dominio originale in B il browser ti permetterà di continuare ad inviare richieste, ma dato che hai cambiato anche il suo dominio, e ora A e B hanno lo stesso dominio possono comunicare tra loro.

è importante prima effettuare almeno una richiesta in B al suo dominio originale, prima di cambiare il dominio. inoltre, non funzionerà se entrambe le pagine non sono servite dallo stesso host, quindi nella maggior parte dei casi non risolve il problema, ma ti dà un po 'più spazio di manovra.

ho usato questo trucco più di una volta e non ho riscontrato alcun problema, per quanto ne so, funziona su tutti i browser, fammi sapere se non lo fa in alcuni casi.

Ecco un esempio di pseudo:

in A 
================== 
document.domain = "example.com"; 
var child; // keep reference to B 
function setChild(win) { 
    childDocument = win; 
} 

function handleMessage(message) { 
    do what ever it is you need to 
} 

in B 
================== 
make ajax request 
document.domain = "example.com"; 
parent.setChild(this); 

function ajaxCallback(message) { 
    parent.handleMessage(message); 
} 
+0

Lo proverò anche io. Ma ho provato ajax semplicemente cambiando dominio e non ha funzionato prima. Ma darò una prova in questo modo. Iframe funziona bene in caso di chiamate di sottodominio.Puoi trovare la soluzione qui: https://github.com/emphaticsunshine/Cross-sub-domain-solution – emphaticsunshine

+0

devi prima fare una chiamata ajax e solo dopo puoi cambiare il dominio, altrimenti, dato che hai cambiato il dominio prima di fare una richiesta Ajax, le richieste non riusciranno a causa della politica di sicurezza. se capisco la tua soluzione, allora è esattamente come jsonp, con la limitazione che le origini iframe possono essere servite solo dallo stesso host. –

Problemi correlati