Restituzione del reindirizzamento come risposta alla richiesta XHR


Risposte:


216

Cosa succede se il browser riceve una risposta di reindirizzamento a una richiesta Ajax?

Se il server invia un reindirizzamento (ovvero una risposta 302 più un'intestazione Location:) il reindirizzamento viene automaticamente seguito dal browser. La risposta alla seconda richiesta (supponendo che non sia anche un altro reindirizzamento) è ciò che è esposto al tuo programma.

In effetti, non hai la possibilità di rilevare se si è verificata una risposta 302. Se il reindirizzamento 302 porta a 200, il programma agisce in modo identico come se la richiesta originale portasse direttamente a 200.

Questa è stata sia la mia esperienza che il comportamento indicato nelle specifiche .

Aggiornamento 2016: il tempo è passato e la buona notizia è che la nuova API fetch () è stata progettata per offrire un controllo più fine su come vengono gestiti i reindirizzamenti , con un comportamento predefinito simile a XHR. Detto questo, funziona solo dove fetch () è implementato in modo nativo . Le versioni Polyfill di fetch (), che sono basate su XHR, continuano ad avere i limiti di XHR . Fortunatamente, il supporto del browser nativo sembra completarsi bene.


47
È interessante notare che sono arrivato a questo perché sto vivendo una situazione in cui il reindirizzamento apparentemente non viene seguito ... questo accade quando il reindirizzamento viola la stessa politica di origine.
Gus,

4
@Gus che è probabilmente logico
Dmitry

1
Nel caso di un reindirizzamento a un 401 (o qualsiasi errore 4xx o 5xx) presumo che il tuo programma si comporterebbe come se la richiesta portasse direttamente a un 401. Non è quello che stai vedendo?
greim il

2
Un'API RESTful può inviare 201 e un'intestazione Location dopo una richiesta POST; vedi restapitutorial.com/lessons/httpmethods.html .

1
Aggiornamento 2019: il recupero non funziona come ci aspettavamo 3 anni fa):
ljjury

7

Il ajax-requestseguirà che afaik reindirizzamento. Il contenuto effettivo ( .responseText, .responseXML) sarà il contenuto della pagina in cui sei reindirizzato.

Potresti essere in grado di intercettare il reindirizzamento ( status-code, location-header) su readyState2 o 3, ma non sei sicuro.


No, tutti quegli stati hanno lo stesso identico status. Anche il valore di getAllResponseHeaders()è uguale.
sebastianwagner,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.