javascript - redirection - No se puede manejar la redirección 302 en ajax y por qué?
redirect 301 apache (1)
Esta pregunta ya tiene una respuesta aquí:
Tengo un servidor de back-end escrito en asp.net mvc utilizando Forms Authentication. Cuando el usuario no está autenticado, el servidor enviará automáticamente un redireccionamiento 302 a una acción de inicio de sesión y devolverá una página de inicio de sesión.
En el lado del cliente, tengo una lista de artículos. Esta lista solo es accesible para usuarios autenticados. En la página, tengo un botón para Actualizar la lista usando Ajax (función $ .ajax de jQuery).
Ahora, mi problema es cuando el ticket de autenticación está agotado y el usuario hace clic en el botón Actualizar:
- Mi función envía una solicitud ajax para obtener la lista actualizada
- El servidor detecta que el ticket de autenticación no es válido y emite un redireccionamiento 302.
- El navegador maneja automáticamente esa respuesta 302 y fuerza a mi función ajax a enviar otra solicitud ajax a la acción de inicio de sesión y el resultado final es un HTML con estado 200. Mi script se confunde porque la lista también es un HTML con estado 200.
Lo que quiero es que cuando el ticket de autenticación agote el tiempo de espera y el usuario haga clic en el botón Actualizar, debería ser capaz de detectarlo y mostrar un mensaje pidiéndole al usuario que inicie sesión.
Traté de solucionar esto agregando un encabezado personalizado (IS_LOGIN) en la acción Iniciar sesión y verifico eso en mi respuesta de ajax. Pero no es una buena solución.
Entonces mis preguntas son:
- ¿Cuál es la mejor manera de lidiar con este problema?
- ¿Por qué el navegador no permite que nuestro script maneje la respuesta 302? y simplemente fuerza automáticamente a nuestro ajax para crear otra solicitud. ¿Este es un problema con el navegador o la biblioteca jquery? ¿Alguna razón para esto? (seguridad,...)
Gracias por cualquier respuesta.
No debe redirigir la llamada cuando se trata de un XHR pero responder con un 401 Unauthorized
y manejar esto en sus devoluciones de llamada. No sé ASP.NET pero hice algo similar con Spring Security.
Aquí está el concepto:
- Obtener el estado autenticado
- Compruebe los encabezados para
X-Requested-With: XMLHttpRequest
- Cuando se encuentra y no está autenticado, responda con
401 Unauthorized
- Cuando no se encuentra y no se autentica redirigir.
La conclusión es que las llamadas XHR deben manejarse de manera diferente a otras solicitudes HTTP en algunos casos. Solo debe redirigir un XHR si el mismo recurso se encuentra en otra ubicación.
Para responder tu pregunta
No puede manejar redirecciones con devoluciones de llamada XHR porque el navegador se ocupa de ellas automáticamente. Solo recibirá lo que devuelve en la ubicación redireccionada.