web-dev-qa-db-fra.com

Détecter une redirection dans jQuery $ .ajax?

Je veux utiliser jQuery pour obtenir une URL et vérifier explicitement si elle a répondu avec une redirection 302, mais pas suivez la redirection.

jQuery's $.ajax semble toujours suivre les redirections. Comment puis-je empêcher cela et voir la redirection sans la suivre?

Il existe diverses questions portant des titres tels que "jquery ajax redirect", mais elles semblent toutes impliquer la réalisation d'un autre objectif, plutôt que de simplement vérifier le statut qu'un serveur donne.

85
kdt

La demande AJAX n'a jamais la possibilité de NE PAS suivre la redirection (c.-à-d. Qu'elle doit suivre la redirection). Plus d'informations peuvent être trouvées dans cette réponse https://stackoverflow.com/a/2573589/965648

78
Nick Garvey

Bienvenue dans le futur!

Nous avons actuellement une propriété "responseURL" de l'objet xhr. YAY!

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

Cependant, jQuery (au moins 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.

[~ # ~] Conseil [~ # ~] : il suffit de comparer l'URL d'origine à responseUrl. Si c'est égal alors aucune redirection n'a été donnée. Si "indéfini", alors responseUrl n'est probablement pas pris en charge. Cependant, comme Nick Garvey l’a dit, AJAX n’a jamais l’occasion de NE PAS suivre la redirection, mais vous pouvez résoudre un certain nombre de tâches en utilisant responseUrl propriété.

38
Riki_tiki_tavi

Alors que les autres personnes qui ont répondu à cette question ont (tristement) raison de dire que cette information nous est cachée par le navigateur, j'ai pensé publier 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 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 la compare à l'URL qu'il avait initialement demandée via $.ajax(). Si les chaînes diffèrent, je sais qu'il y a eu une redirection, ainsi que l'adresse URL à laquelle nous sommes arrivés.

Cela a l’inconvénient de nécessiter une aide côté serveur, et peut également tomber en panne si l’URL est munie (en raison de problèmes de citation/encodage, etc.) au cours de l’aller-retour ... mais dans 99% des cas, cela semble se produire. le travail fait.


Du côté serveur, mon cas spécifique était une application python utilisant le framework web Pyramid, et j’ai utilisé le fragment 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
9
Eli Collins

Vous pouvez maintenant utiliser chercher API /Il retourne redirected: *boolean*

0
fvrab