IE9 jQuery AJAX with CORS retourne "L'accès est refusé"

les travaux suivants dans tous les navigateurs sauf IE (je teste dans IE 9).

jQuery.support.cors = true;
...
        $.ajax(
            url + "messages/postMessageReadByPersonEmail",
            {
                crossDomain: true,
                data: {
                    messageId       : messageId,
                    personEmail     : personEmail
                },
                success: function() {
                    alert('marked as read');
                },
                error: function(a,b,c) {
                    alert('failed');
                },
                type: 'post'
            }
        );

j'ai une autre fonction qui utilise dataType: 'jsonp' , mais je n'ai pas besoin de données retournées sur cet appel AJAX. Mon dernier recours sera de rendre un peu de jibberish enveloppé dans du JSONP juste pour que ça marche.

avez-vous une idée de la raison pour laquelle IE fait tout foirer avec une requête CORS qui ne renvoie aucune donnée?

122
demandé sur ronnyfm 2012-04-19 19:56:27

12 réponses

c'est un connu bug avec jQuery. L'équipe de jQuery "n'a pas l'intention de supporter cela dans core et est mieux adapté comme un plugin."(Voir ce commentaire ). IE ne pas utiliser le XMLHttpRequest , mais un autre objet nommé XDomainRequest .

il est un plugin disponible pour supporter cela dans jQuery, qui peut être trouvé ici : https://github.com/jaubourg/ajaxHooks/blob/master/src/xdr.js

EDIT La fonction $.ajaxTransport enregistre une usine de transport. Un transporteur est utilisé à l'interne par $.ajax pour effectuer des requêtes. Par conséquent, je supposer vous devriez être en mesure d'appeler $.ajax comme d'habitude. Informations sur les transporteurs et l'extension $.ajax peut être trouvé ici .

aussi, une version peut-être meilleure de ce plugin se trouve ici .

deux autres notes:

  1. L'objet XDomainRequest était introduit de IE8 et ne fonctionnera pas dans les versions ci-dessous.
  2. de IE10 CORS sera pris en charge en utilisant une XMLHttpRequest normale .

Edit 2: http, https problème

les demandes doivent être ciblées sur le même schéma que la page d'accueil

cette restriction signifie que si votre page AJAX est à http://example.com , alors L'URL cible doit aussi commencer par HTTP. De même, si votre page AJAX est à https://example.com , alors votre L'URL cible doit aussi commencer par HTTPS.

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

149
répondu dennisg 2016-04-11 16:37:14

en me basant sur la réponse acceptée par @dennisg, j'ai réussi avec succès en utilisant jQuery.XDomainRequest.js par MoonScript.

le code suivant a fonctionné correctement dans Chrome, Firefox et IE10, mais a échoué dans IE9. J'ai simplement inclus le script et il fonctionne maintenant automatiquement dans IE9. (Et probablement 8, mais je ne l'ai pas testé.)

var displayTweets = function () {
    $.ajax({
        cache: false,
        type: 'GET',
        crossDomain: true,
        url: Site.config().apiRoot + '/Api/GetTwitterFeed',
        contentType: 'application/json; charset=utf-8',
        dataType: 'json',
        success: function (data) {
            for (var tweet in data) {
                displayTweet(data[tweet]);
            }
        }
    });
};
62
répondu JackMorrissey 2013-06-17 18:16:38

des instructions complètes sur la façon de faire ceci en utilisant le plugin" jQuery-ajaxTransport-XDomainRequest " peuvent être trouvées ici: https://github.com/MoonScript/jQuery-ajaxTransport-XDomainRequest#instructions

ce plugin est activement supporté, et gère HTML, JSON et XML. Le fichier est également hébergé sur CDNJS, de sorte que vous pouvez déposer directement le script dans votre page sans installation supplémentaire: http://cdnjs.cloudflare.com/ajax/libs/jquery-ajaxtransport-xdomainrequest/1.0.1/jquery.xdomainrequest.min.js

16
répondu MoonScript 2013-11-05 19:15:03

le problème est que IE9 et inférieur ne supportent pas les CORS. XDomainRequest ne supporte que GET / POST et le type de contenu text/plain comme décrit ici: http://blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations-and-workarounds.aspx

donc si vous voulez utiliser tous les verbes HTTP et/ou json etc vous devez utiliser une autre solution. J'ai écrit un proxy qui va gracieusement rétrograder en proxying si IE9 ou moins est utilisée. Vous ne devez pas changer votre code du tout si vous utilisez ASP.NET.

La solution est en deux parties. Le premier est un script jquery qui s'accroche au traitement ajax jQuery. Il appellera automatiquement le serveur web si une requête de type 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;
    }
});

dans votre serveur web vous devez recevoir la requête, obtenir la valeur de l'en-tête http x-CorsProxy-Url et faire une requête HTTP et enfin retourner résultat.

mon billet de blog: http://blog.gauffin.org/2014/04/how-to-use-cors-requests-in-internet-explorer-9-and-below /

3
répondu jgauffin 2014-04-24 11:07:23

je viens de faire toutes les requêtes JSONP parce que c'était la seule solution pour tous nos navigateurs pris en charge (IE7+ et les habitués). Attention, votre réponse fonctionne techniquement pour IE9 donc vous avez la bonne réponse.

1
répondu Garrett 2012-04-20 17:57:17

faire une croix-domaine de JSON avec jQuery dans Internet Explorer 8 et versions plus récentes

lien très utile:

http://graphicmaniacs.com/note/getting-a-cross-domain-json-with-jquery-in-internet-explorer-8-and-later /

peut aider avec la difficulté de retourner json à partir d'une requête de domaine X.

J'espère que ça aidera quelqu'un.

1
répondu jmarcosSF 2013-05-30 20:11:59

en S'appuyant sur la solution de MoonScript, vous pouvez essayer ceci à la place:

https://github.com/intuit/xhr-xdr-adapter/blob/master/src/xhr-xdr-adapter.js

l'avantage est que puisque c'est une solution de niveau inférieur, il permettra CORS (dans la mesure du possible) sur IE 8/9 avec d'autres cadres, pas seulement avec jQuery. J'ai réussi à l'utiliser avec AngularJS, ainsi que jQuery 1.x et 2.x.

1
répondu yanni 2014-08-15 22:54:13

pour résoudre ce problème, vérifiez également si vous en avez inclus .js dans votre fichier ajax appelé: J'ai reçu Accès refusé erreur tout en incluant shadowbox.js dans mon ajax.php

0
répondu hacklover 2013-07-08 08:04:25

je testais un service Web de CORS sur ma machine dev et je recevais le message d'erreur" Accès refusé " dans SEULEMENT IE. Firefox et Chrome ont bien fonctionné. Il s'avère que cela a été causé par mon utilisation de localhost dans l'appel ajax! Donc mon URL de navigateur était quelque chose comme:

http://my_computer.my_domain.local/CORS_Service/test.html

et mon appel ajax à l'intérieur du test.html était quelque chose comme:

//fails in IE 
$.ajax({
  url: "http://localhost/CORS_Service/api/Controller",
  ...
});

tout a fonctionné une fois que j'ai changé l'appel ajax pour utiliser mon IP d'ordinateur au lieu de localhost.

//Works in IE
$.ajax({
  url: "http://192.168.0.1/CORS_Service/api/Controller",
  ...
});

L'onglet" Réseau "de la fenêtre" IE dev tools " montre également la requête D'OPTIONS Préflight du CORS suivie du GET XMLHttpRequest, ce qui est exactement ce que je m'attendais à voir.

0
répondu jwill212 2013-11-07 13:37:15

mise à jour début 2015. xDomain est une bibliothèque largement utilisée pour prendre en charge les CORS sur IE9 avec un codage supplémentaire limité.

https://github.com/jpillora/xdomain

0
répondu Alkaline 2015-02-13 04:42:48

Essayez d'utiliser jquery-transport-xdr plugin jQuery pour la SCRO demandes dans IE8/9.

0
répondu Gordon Freeman 2015-10-06 17:21:03

Note -- Note

ne pas utiliser " http://www.domaine.xxx " ou " http://localhost/ " ou "IP >> 127.0.0.1" pour les URL en ajax. utilisez uniquement le chemin(répertoire) et le nom de la page sans adresse.

faux de l'état:

var AJAXobj = createAjax();
AJAXobj.onreadystatechange = handlesAJAXcheck;
AJAXobj.open('POST', 'http://www.example.com/dir/getSecurityCode.php', true);
AJAXobj.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
AJAXobj.send(pack);

véritable état:

var AJAXobj = createAjax();
AJAXobj.onreadystatechange = handlesAJAXcheck;
AJAXobj.open('POST', 'dir/getSecurityCode.php', true);   // <<--- note
AJAXobj.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
AJAXobj.send(pack);
-1
répondu ali bagheri 2015-06-28 21:03:49