web-dev-qa-db-fra.com

CORS avec jQuery et XDomainRequest dans IE8 / 9

UPDATE: Je recommande vivement de ne pas investir à tout moment dans XDomainRequest, car sa mise en œuvre est terriblement mauvaise et comporte de nombreuses limitations. En gros, cela ne fonctionne vraiment que pour les requêtes GET adressées à des serveurs autres que SSL, vous pouvez donc aussi bien utiliser jsonp ou autre.


J'utilise CORS pour appeler une API interdomaine, mais Internet Explorer pose des problèmes. CORS devrait être possible dans IE8 et IE9 via l'objet XDomainRequest, mais je ne parviens pas à faire fonctionner les choses ..

JQuery refuse pour fournir un support natif pour XDomainRequest, cependant plusieurs plugins jQuery sont suggérés pour ajouter ce support. This topic suggère deux de ces plugins: jQuery.XDomainRequest.js et xdr.js , qui a été signalé pour fonctionner. Après tout, les plugins devraient automatiquement annuler le comportement de jQuery.ajax. J'ai trouvé un autre plugin ici .

Je mets un peu de pages de démonstration avec les plugins respectifs jQuery.XDomainRequest et xdr et jquery.ie.cors qui effectuent des requêtes ajax à un CORS activé serveur. Les pages fonctionnent dans Chrome et Firefox, toutefois IE8/9 envoie instantanément une erreur d'autorisation refusée (avant même de faire la demande). This publication MSDN suggère d'ajouter un autre gestionnaire xhr.onprogress = function() {}; mais j'ai essayé et ça ne marche pas non plus.

Des indices sur ce que je fais mal? J'ai également testé avec IE8 maintenant en utilisant le serveur virtuel MS, mais il a exactement le même problème.

Edit: OK, j’ai donc compris qu’une partie du problème était que j’utilisais POST sur HTTPS. Apparemment, XDomainRequest n’autorise pas CORS sur HTTPS. Je peux passer à HTTP, mais j’ai vraiment besoin de POST.

Edit2: Voir ce numéro sur github pour la fin de cette histoire. Il s'avère qu'en utilisant HTTP POST, xDomainRequest peut uniquement coder le corps de la requête (arguments) sous la forme text/plain. Cela rend quasiment tout cela inutile, car tout le monde utilise application/x-www-form-urlencoded Ou multipart/form-data.

62
Jeroen

La méthode POST est prise en charge et pour créer une demande https: // entre domaines, votre page d’appel doit également être chargée via https. C'est le meilleur article que j'ai trouvé qui explique en détail ces limitations et d'autres limitations de XDomainRequest:

http://blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations-and-workarounds.aspx

28
Adam Alexander

J'ai écrit un proxy qui rétrogradera gracieusement au proxy si IE9 ou moins est utilisé. Vous n'êtes pas obligé de changer votre code si vous utilisez ASP.NET.

La solution est en deux parties. Le premier est un script jQuery qui se connecte au traitement ajax de jQuery. Il appellera automatiquement le serveur Web si une demande crossDomain est faite et que le navigateur est IE:

$.ajaxPrefilter(function (options, originalOptions, jqXhr) {
    if (!window.CorsProxyUrl) {
        window.CorsProxyUrl = '/corsproxy/';
    }
    // only proxy those requests
    // that are marked as crossDomain requests.
    if (!options.crossDomain) {
        return;
    }

    if (getIeVersion() && getIeVersion() < 10) {
        var url = options.url;
        options.beforeSend = function (request) {
            request.setRequestHeader("X-CorsProxy-Url", url);
        };
        options.url = window.CorsProxyUrl;
        options.crossDomain = false;
    }
});

Sur votre serveur Web, vous devez recevoir la demande, obtenir la valeur du fichier X-CorsProxy-Url en-tête http et effectuez une requête HTTP et renvoyez enfin le résultat.

Mon article de blog: http://blog.gauffin.org/2014/04/how-to-use-cors-requests-in-internet-Explorer-9-and-below/

5
jgauffin

Pour les requêtes [~ # ~] [~ # ~] dans IE8/9, vous pouvez utiliser le plugin jQuery jquery-transport-xdr

0
Gordon Freeman