Renvoi de la redirection en réponse à la demande XHR

Réponses:

216

Que se passe-t-il si le navigateur reçoit une réponse de redirection à une demande ajax?

Si le serveur envoie une redirection (c'est-à-dire une réponse 302 plus un en-tête Location:), la redirection est automatiquement suivie par le navigateur. La réponse à la deuxième requête (en supposant qu'il ne s'agisse pas non plus d'une autre redirection) est ce qui est exposé à votre programme.

En fait, vous ne pouvez pas détecter si une réponse 302 s'est produite. Si la redirection 302 mène à un 200, alors votre programme agit de la même manière que si la demande d'origine menait directement à un 200.

Cela a été à la fois mon expérience et le comportement mentionné dans la spécification .

Mise à jour 2016: le temps est passé et la bonne nouvelle est que la nouvelle API fetch () est conçue pour offrir un contrôle plus fin sur la gestion des redirections , avec un comportement par défaut similaire à XHR. Cela dit, cela ne fonctionne que là où fetch () est implémenté de manière native . Les versions Polyfill de fetch () - qui sont basées sur XHR - continuent à avoir les limitations de XHR . Heureusement, la prise en charge des navigateurs natifs semble bien se terminer.

greim
la source
47
Fait intéressant, j'y suis arrivé parce que je rencontre une situation où la redirection n'est apparemment pas suivie ... cela se produit lorsque la redirection viole la même politique d'origine.
Gus
4
@Gus qui est probablement logique
Dmitry
1
Dans le cas d'une redirection vers un 401 (ou toute erreur 4xx ou 5xx), je suppose que votre programme se comporterait comme si la demande menait directement à un 401. N'est-ce pas ce que vous voyez?
greim
2
Une API RESTful peut envoyer 201 et un en-tête Location après une requête POST; voir restapitutorial.com/lessons/httpmethods.html .
1
Mise à jour 2019: la récupération ne fonctionne pas comme
prévu
7

Le ajax-requestsuivra cette redirection afaik. Le contenu réel ( .responseText, .responseXML) sera le contenu de la page vers laquelle vous êtes redirigé.

Vous pourrez peut-être intercepter la redirection ( status-code, location-header) sur readyState2 ou 3, mais vous n'en êtes pas sûr.

jishi
la source
Non, tous ces États ont exactement le même statut. Même la valeur de getAllResponseHeaders()est égale.
sebastianwagner