Retornando o redirecionamento como resposta à solicitação XHR

Respostas:

216

O que acontece se o navegador receber uma resposta de redirecionamento para uma solicitação ajax?

Se o servidor enviar um redirecionamento (também conhecido como resposta 302 mais um cabeçalho Location:), o redirecionamento será automaticamente seguido pelo navegador. A resposta à segunda solicitação (assumindo que também não é outro redirecionamento) é o que está exposto ao seu programa.

De fato, você não tem a capacidade de detectar se uma resposta 302 ocorreu. Se o redirecionamento 302 levar a um 200, seu programa atuará de forma idêntica como se a solicitação original levasse diretamente a um 200.

Essa foi minha experiência e o comportamento mencionado nas especificações .

Atualização de 2016: o tempo passou e a boa notícia é que a nova API fetch () deve oferecer um controle mais refinado de como os redirecionamentos são tratados , com comportamento padrão semelhante ao XHR. Dito isto, ele só funciona onde fetch () é implementado nativamente . As versões do polyfill do fetch () - que são baseadas no XHR - continuam com as limitações do XHR . Felizmente, o suporte nativo ao navegador parece estar bem completo.

gritar
fonte
47
Curiosamente, cheguei a isso porque estou enfrentando uma situação em que o redirecionamento aparentemente não está sendo seguido ... isso acontece quando o redirecionamento viola a mesma política de origem.
Gus
4
@Gus, o que provavelmente é lógico #
Dmitry
1
No caso de um redirecionamento para um 401 (ou qualquer erro 4xx ou 5xx), eu assumiria que seu programa se comportaria como se a solicitação levasse diretamente a um 401. Não é isso que você está vendo?
greim
2
Uma API RESTful pode enviar 201 e um cabeçalho de local após uma solicitação POST; consulte restapitutorial.com/lessons/httpmethods.html .
1
Atualização de 2019: fetch não funciona como esperávamos há 3 anos):
lcjury
7

O ajax-requestseguirá que redirecionar afaik. O conteúdo real ( .responseText, .responseXML) será o conteúdo da página para a qual você é redirecionado.

Você pode interceptar o redirecionamento ( status-code, location-header) em readyState2 ou 3, mas não tem certeza.

jishi
fonte
Não, todos esses estados têm exatamente o mesmo status. Mesmo o valor de getAllResponseHeaders()é igual.
sebastianwagner