Devolución de redireccionamiento como respuesta a la solicitud XHR

Respuestas:

216

¿Qué sucede si el navegador recibe una respuesta de redireccionamiento a una solicitud ajax?

Si el servidor envía una redirección (también conocida como una respuesta 302 más una ubicación: encabezado), la redirección es seguida automáticamente por el navegador. La respuesta a la segunda solicitud (suponiendo que tampoco sea otra redirección) es lo que está expuesto a su programa.

De hecho, no tiene la capacidad de detectar si se ha producido una respuesta 302. Si la redirección 302 conduce a un 200, entonces su programa actúa de manera idéntica como si la solicitud original condujera directamente a un 200.

Esta ha sido mi experiencia y el comportamiento mencionado en la especificación .

Actualización de 2016: ha pasado el tiempo y la buena noticia es que la nueva API fetch () está diseñada para ofrecer un control más detallado de cómo se manejan las redirecciones , con un comportamiento predeterminado similar al XHR. Dicho esto, solo funciona donde fetch () se implementa de forma nativa . Las versiones Polyfill de fetch (), que se basan en XHR, continúan teniendo las limitaciones de XHR . Por suerte, compatibilidad con el navegador nativo parece estar redondeando muy bien.

greim
fuente
47
Curiosamente, llegué a esto porque estoy experimentando una situación en la que aparentemente no se sigue la redirección ... esto sucede cuando la redirección viola la misma política de origen.
Gus
44
@Gus que probablemente sea lógico
Dmitry
1
En el caso de una redirección a un 401 (o cualquier error 4xx o 5xx) asumiría que su programa se comportaría como si la solicitud condujera directamente a un 401. ¿No es eso lo que está viendo?
greim
2
Una API RESTful puede enviar 201 y un encabezado de ubicación después de una solicitud POST; ver restapitutorial.com/lessons/httpmethods.html .
1
Actualización de 2019: fetch no funciona como esperábamos hace 3 años):
lcjury
7

El ajax-requestseguirán que yo sepa redirección. El contenido real ( .responseText,.responseXML ) será el contenido de la página a la que se le redirige.

Es posible que pueda interceptar la redirección ( status-code, location-header) en readyState2 o 3, pero no está seguro.

jishi
fuente
No, todos esos estados tienen exactamente el mismo estado. Incluso el valor de getAllResponseHeaders()es igual.
sebastianwagner