9

Sto provando a effettuare una chiamata AJAX da più domini a una singola che gestirà la richiesta. L'attivazione del dominio Croce in Firefox e Chrome è stato facile impostando l'intestazione sul server manipolazione:Controllo accessi per richieste cross-site in Internet Explorer

header("Access-Control-Allow-Origin: *"); 

Ma questo non aiuta le consente in Internet Explorer. Quando provo:

httpreq.send(''); 

si arresta con errore di accesso negato.

Come può essere abilitato in Internet Explorer?

+0

IE 10 funziona correttamente, IE8/9 con limitazione. Vedi http://caniuse.com/#search=cors – gavenkoa

+0

Quali sono i limiti specifici del supporto CORS in IE9? – Umopepisdn

risposta

5

Non credo che lo si possa fare direttamente in Internet Explorer. Hai un paio di opzioni:

  • creare uno script di inoltro del proxy sul server fate controllo che può inoltrare le richieste Ajax. Assicurati di inoltrare solo le destinazioni appropriate di cui hai bisogno in modo da non trasformarti in un relay anonimo.

  • Utilizzare il trucco document.domain. Fondamentalmente è necessario creare un set di iframe s, uno per ogni server a cui è necessario effettuare chiamate Ajax. All'interno di ogni iframe impostare la proprietà document.domain in modo che corrisponda esattamente al dominio necessario per inviare le richieste Ajax a. Per quanto riguarda la compilazione dei dati necessari, utilizzare la manipolazione DOM prima di impostare document.domain. Nota che questo trucco richiede che i server di destinazione si trovino in sottodomini dell'originale. Altro in this article, con esempi.

+0

Siamo spiacenti per la risposta in ritardo. L'ho fatto con lo script proxy sul server. –

1

Per Internet Explorer 8, è necessario fare come per FF3, cioè utilizzare l'intestazione "Access-Control-Allow-Origin" più utilizzare XDomainRequest oggetto invece di XMLHttpRequest. Tutto è explaiend in dettaglio qui per IE8: http://msdn.microsoft.com/en-us/library/dd573303%28VS.85%29.aspx

vecchi sapori di IE non supportano Cross Site Access Control né oggetti XDomainRequest. Tuttavia non è finita, si potrebbe ricorrere al trucco IFrame per esempio, vale a dire la creazione di un IFrame invisibile che chiama le funzioni come descritto qui: http://softwareas.com/cross-domain-communication-with-iframes

0

Basta aggiungere alla risposta di Eric, per vecchia versione di Internet Explorer, è possibile utilizzare il metodo $ .ajax di jQuery 1.4.2, che di default permette alle richieste tra domini diversi, o per il cross dominio JSON, è possibile utilizzare

jQuery.getJSON (stringa URL, dati cartografici, callback Function) restituisce XMLHttpRequest

Un estratto da documenti Jquery.

"jQuery ora supporta JSONP in modo nativo - se si tenta di caricare JSON (tramite $ .getJSON o $ .ajax) da un URL remoto, verrà fornita una callback aggiuntiva per il server da interpretare."

+0

Per chiarire, questo * solo * funziona per le richieste jsonp. jQuery non fornisce il supporto per XDomainRequest, e le soluzioni alternative che richiedono jQuery 1.5 o versione successiva: http://bugs.jquery.com/ticket/8283 –

3

ho avuto IE8 e 9 lavorare con un solo jQuery $ .ajax (jQuery versione 1.7.2)

jQuery.support.cors = true; 
jQuery(function() { 
$.ajax({ 
    crossDomain : true, 
    dataType: 'html', 
    //... 
    }); 
}); 
12

Molto è cambiato da quando ho inviato la mia soluzione per CORS in IE7 e superiori. Prima di tutto la proprietà jQuery $ .support.cors è vera per impostazione predefinita,.I framework NET 4.0 e successivi non supportano più CORS come implementato nelle versioni 3.5.1 e precedenti. Durante la scrittura di un servizio Web con ASP.NET 4.0, ho installato Thinktecture.IdentityModel, disponibile come pacchetto NuGet. Poi, nel metodo Application_Start del file Global.asax, aggiungere:

void Application_Start(object sender, EventArgs e) 
{ 
    Thinktecture.IdentityModel.Http.Cors.IIS.UrlBasedCorsConfiguration.Configuration 
     .ForResources("*") 
     .ForOrigins("http://localhost:80, http://mydomain") 
     .AllowAll() 
     .AllowMethods("GET", "POST"); 
} 

Ora aggiungere l'elemento httpProtocol entro system.webServer:

<httpProtocol> 
    <customHeaders> 
    <add name="Access-Control-Allow-Origin" value="*" /> 
    <add name="Access-Control-Allow-Headers" value="Content-Type, Accept, X-Requested-With, X-File-Name" /> 
    <add name="Access-Control-Allow-Methods" value="GET, POST" /> 
    </customHeaders> 
</httpProtocol> 

mio $ .ajax chiamata è ora:

$.ajax({ 
    url: serviceUrl, 
    data: JSON.stringify(postData), 
    type: "POST", 
    cache: false, 
    contentType: "application/json; charset=utf-8", 
    dataType: "json", 
    success: onSuccess, 
    error: onError 
}); 
+0

Quando questa domanda è stato pubblicato IE 6 e 7 erano ancora molto comune, e non hanno alcun supporto CORS. Non credo che sia stato implementato anche $ $ .support.cors'. Buono a sapersi, le cose sono migliorate! – Dan

+0

da http://api.jquery.com/jQuery.support/" ... cors è uguale a true se un browser in grado di creare un oggetto XMLHttpRequest e se questo oggetto XMLHttpRequest ha una proprietà withCredentials. Per abilitare le richieste cross-domain in ambienti che non supportano ancora cors, ma consentono le richieste XHR tra domini (gadget Windows, ecc.), impostano $ .support.cors = true; ... ". Ho verificato che funzioni in IE7, IE8 e IE9. –

+0

salvavita. Grazie per aver postato questo. –

5

hai provato non effettuato di accesso ai dati di fonte della Croce domini enter image description here

+1

è stato utile per testare il sito web su localhost: 8080 –

+0

Funziona come un fascino. Davvero utile per testare su localhost +1 – CocoHot