que han llegado a un problema similar y lo resolvió mediante la comprobación del tipo de la solicitud. En mi caso uso de JSON, sino funciona para otras peticiones POST así:
var ajax = req.xhr;
if(ajax) {
res.status(401).json({'msg':'redirect','location':'/login'});
}
else {
req.method = 'get';
res.status(401).redirect('/login');
//Or if you prefer plain text
//res.status(333).send("Redirect");
}
Este maneja tanto el Ajax POST y AJAX y peticiones GET estándar. En el cliente, en el Ajax de devolución de llamada respose:
$.ajax({
type: 'POST',
data: Msg,
url: '/some/post',
dataType: 'JSON'
}).success(function(data, textStatus, req) {
if(data.msg==="redirect") window.location = data.location;
else {...}
}).error(function(data, textStatus, req) {
if(req=="Unauthorized") {
alert("Unauthorized!");
window.location = "/login";
} else if (data.responseJSON.msg==="redirect") window.location = data.responseJSON.location;
else {
//...
}
});
En realidad se puede manejar más estados aquí, a excepción de 302, que es seguido automáticamente por jQuery y se obtiene como respuesta 200 desde la página que querías volver a dirigir a . Así que evito enviar el 302, enviando 401 en mi caso, o cualquier otro estado, por ejemplo 333, que se manejará como un error.
Gracias eso es lo que terminé haciendo, gracias por la aclaración. Esperaba que reemplazaran el tipo de solicitud en el servidor. 'alessioalex sugirió req.method = 'get'; pero eso no funcionó para mí. – Chin
El tipo de solicitud de anulación no importa, el navegador no redirigirá la ubicación de la ventana si recibe una respuesta de redireccionamiento a la solicitud de Ajax (por ejemplo, $ .post o $ .get). por cierto. ¿Puedes aceptar mi respuesta si crees que está bien? –