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?
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:
- L'objet XDomainRequest était introduit de IE8 et ne fonctionnera pas dans les versions ci-dessous.
- 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.
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]);
}
}
});
};
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
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 /
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.
faire une croix-domaine de JSON avec jQuery dans Internet Explorer 8 et versions plus récentes
lien très utile:
peut aider avec la difficulté de retourner json à partir d'une requête de domaine X.
J'espère que ça aidera quelqu'un.
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.
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
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.
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é.
Essayez d'utiliser jquery-transport-xdr plugin jQuery pour la SCRO demandes dans IE8/9.
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);