97 votes

Détecter une redirection dans une requête ajax ?

Je veux utiliser jQuery pour récupérer une URL et vérifier explicitement si elle a répondu par une redirection 302, mais no suivez la redirection.

La méthode de jQuery $.ajax semble toujours suivre les redirections. Comment puis-je éviter cela, et voir la redirection sans la suivre ?

Il existe plusieurs questions portant des titres tels que "jquery ajax redirect", mais elles semblent toutes impliquer l'accomplissement d'un autre objectif, plutôt que de simplement vérifier directement l'état que donne un serveur.

0 votes

Dans mon cas particulier, j'attends une réponse JSON sur succès et la réponse HTML s'il y a eu une redirection vers une page de connexion. J'ai fini par vérifier si xhr.getResponseHeader("content-type") commence par text/html et contient un mot clé tel que "login" et affiche un "your session has timed out" si nécessaire. Bien sûr, ce n'est pas vraiment une réponse mais une solution de contournement.

90voto

Nick Garvey Points 1672

La requête AJAX n'a jamais la possibilité de NE PAS suivre la redirection (c'est-à-dire qu'elle doit suivre la redirection). Vous trouverez de plus amples informations dans cette réponse https://stackoverflow.com/a/2573589/965648

47voto

Riki_tiki_tavi Points 713

Bienvenue dans le futur !

Actuellement, nous avons une propriété "responseURL" de l'objet xhr. HEUREUSE !

Voir Comment obtenir l'url de réponse dans XMLHttpRequest ?

Cependant, jQuery (au moins la version 1.7.1) ne permet pas d'accéder directement à l'objet XMLHttpRequest. Vous pouvez utiliser quelque chose comme ceci :

var xhr;
var _orgAjax = jQuery.ajaxSettings.xhr;
jQuery.ajaxSettings.xhr = function () {
  xhr = _orgAjax();
  return xhr;
};

jQuery.ajax('http://test.com', {
  success: function(responseText) {
    console.log('responseURL:', xhr.responseURL, 'responseText:', responseText);
  }
});

Ce n'est pas une solution propre et je suppose que l'équipe de jQuery fera quelque chose pour responseURL dans les prochaines versions.

TIP : il suffit de comparer l'URL d'origine avec responseUrl. Si c'est égal, alors aucune redirection n'a été donnée. Si c'est "undefined" alors responseUrl n'est probablement pas supporté. Cependant, comme Nick Garvey l'a dit, les requêtes AJAX n'ont jamais l'opportunité de NE PAS suivre la redirection mais vous pouvez résoudre un certain nombre de tâches en utilisant responseUrl propriété.

13voto

Eli Collins Points 3311

Bien que les autres personnes ayant répondu à cette question aient (malheureusement) raison de dire que cette information nous est cachée par le navigateur, j'ai pensé poster une solution de contournement que j'ai trouvée :

J'ai configuré mon application serveur pour définir un en-tête de réponse personnalisé ( X-Response-Url ) contenant l'url qui a été demandée. Chaque fois que mon code ajax reçoit une réponse, il vérifie si xhr.getResponseHeader("x-response-url") est défini, auquel cas il le compare à l'url qu'il a demandé à l'origine via $.ajax() . Si les chaînes diffèrent, je sais qu'il y a eu une redirection, et en plus, je sais à quelle url nous sommes arrivés.

Cette méthode a l'inconvénient de nécessiter une aide côté serveur, et peut aussi tomber en panne si l'url est tronquée (à cause de problèmes de citation/encodage, etc.) pendant le trajet aller-retour... mais dans 99 % des cas, cela semble faire l'affaire.


Du côté serveur, mon cas spécifique était une application python utilisant le framework web Pyramid, et j'ai utilisé le snippet suivant :

import pyramid.events

@pyramid.events.subscriber(pyramid.events.NewResponse)
def set_response_header(event):
    request = event.request
    if request.is_xhr:
        event.response.headers['X-Response-URL'] = request.url

0 votes

Il est vrai qu'il n'y a aucun moyen de savoir s'il y a une redirection sans la prendre ; mais peut-être que la comparaison de l'URL d'en-tête attendue avec celle redirigée peut être une solution de contournement pour moi en ce moment. Merci pour cette idée

8voto

atornblad Points 5599

JQuery fonctionne dans les limites du moteur javascript de votre navigateur. Chaque ressource qui est demandée par le biais d'éléments javascript ou html (lien, script, image, audio ou vidéo etc) est soumis à une redirection http. Il n'y a malheureusement aucun moyen pour javascript d'accéder au http de bas niveau de la manière dont vous en auriez besoin.

Alors désolé, la réponse est non.

6voto

fvrab Points 570

Vous pouvez maintenant utiliser récupérer l'API / Il retourne redirected: *boolean*

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X