2012-03-11 12 views
18

Poiché jQuery ajax non funziona per CORS/IE, sto utilizzando XDomainRequest per recuperare i dati da un altro server. Funziona bene, ma vorrei inviare qualche intestazione ('Authentification', 'content-type').intestazione cross-origin in IE8/IE9

C'è la possibilità di aggiungere/cambiare intestazione in XDomainRequest?

Oppure qualcuno conosce una soluzione alternativa?

risposta

17

Questo è quello che abbiamo fatto per IE.

Se si ha il controllo sul dominio di destinazione, ospitare lì un file html (statico). Includi l'html usando l'iframe.

Ora questo iframe ha effettivamente accesso al dominio locale, quindi è possibile comunicare tra il frame padre e figlio per ottenere ciò di cui si ha bisogno.

Questo ha funzionato molto meglio di XDomainRequest per noi.

window.postMessage è il modo migliore per impostare la comunicazione:

Ma sono abbastanza sicuro che solo iniziato a lavorare dal IE8. Se hai bisogno di browser più vecchi, devi usare un altro hack.

Nel nostro caso, questo era il nostro sistema a 3 strati:

  1. CORS, per i browser che lo supportano
  2. Un iframe & window.postMessage come ripiego primario
  3. Un proxy server-side script come fallback secondario

Tutte queste opzioni funzionano bene, sono affidabili e non si sentono troppo come un hack. Il ripiego secondario è stato usato quasi mai.

Ricordare che l'intestazione "Autenticazione" è specificamente speciale e non sarei scioccato dal fatto che sia comunque bloccato in determinate circostanze. Abbiamo aggiunto un'intestazione personalizzata 'X-Authenticate' mentre passava tutto il tempo.

+0

Ho dato un'occhiata alla soluzione alternativa dell'iframe negli ultimi giorni. Ma dal momento che devi impostare 'document.domain', sembra funzionare solo per la comunicazione tra due sottodomini dello stesso TLD. Ma per quanto riguarda due diversi TLD? (Potrei dover scavare più a fondo nelle cose del server proxy nel fine settimana ...) –

+0

La soluzione iframe * dovrebbe * funzionare se l'iframe è ospitato nello stesso dominio dell'API. Se uno script proxy è una soluzione per te, potrebbe essere * molto * più facile per i tuoi scopi. Si noti che è (di solito) non tanto un server proxy, in quanto è solo uno script proxy lato server. – Evert

+0

ok, ho fatto funzionare l'iframe. Sto passando un oggetto con tutte le informazioni (intestazioni, post-corpo, ...) alla finestra del frame, che esegue le richieste e restituisce la risposta. :) Informazioni sullo script proxy: se ospito lo script sul server API, dovrei comunque inviare la richiesta con le intestazioni in Ajax. Quindi lo script dovrebbe trovarsi sullo stesso server della pagina "request"? (=^cliente)? In questo modo, IE mi consente di inviare intestazioni, corpo, ecc. e il proxy invia la richiesta al api-server (curl)?!? –

2

XDomainRequest di IE non consente di impostare intestazioni personalizzate. Vedere l'articolo n. 3 qui: http://blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations-and-workarounds.aspx L'oggetto XDomainRequest è bloccato fino al punto in cui è difficile effettuare richieste autenticate.

+1

Ma ci deve essere una soluzione!?! O l'IE è peggio di quanto pensassi? –

+1

Senza la possibilità di impostare intestazioni o cookie personalizzati, non sono sicuro di un buon modo di fare richieste autenticate. Potresti passare le credenziali di autenticazione come parametro di query (credo che il flusso di user-agent di OAuth2 permetta questo), tuttavia questo potrebbe non essere sicuro (e dovrebbe essere fatto su SSL). Spiacente, forse qualcun altro ha una risposta migliore :-) – monsur

+0

Pensavo che avessi bisogno di loro per accedere al sito degli altri domini. (impostando quindi i cookie di sessione appropriati e le intestazioni auth). Quindi il tuo XDomainRequest userebbe la sessione che hanno stabilito? Potrei sbagliarmi comunque. –

Problemi correlati