使用 jQuery 执行 ajax POST,因为页面要求用户进行身份验证,有时(当 session 过期时),服务器会响应 302。所以我试图从 ajax 捕获该响应代码并重定向到主页。
我的ajax看起来像这样:
$.ajax(this.action, {
type: "POST",
data: {value:input},
statusCode: {
301: function(resp){
window.location.replace('/');
},
302: function(resp){
window.location.replace('/');
}
},
success: function(response){
$('#obtained').val(response);
},
error: function(error){
alert(error);
}
});
但由于某种原因,302 或任何其他状态代码中的函数永远不会被触发。
这是已弃用的还是我遗漏了什么?
谢谢!
最佳答案
嗯,显然问题出在 302 重定向上。服务器确实返回 302,但是,ajax 遵循该重定向并最终获得 200 状态代码,这导致 302 状态代码内的函数永远不会被触发。
解决方案是使用此问题中的一些回复:How to manage a redirect request after a jQuery Ajax call
最终的 ajax 调用如下所示:
$.ajax({
type: "POST",
data: {value:input},
statusCode: {
301: function(response){
window.location.reload();
},
302: function(response){
window.location.reload();
}
}
}).done(function(data, statusText, xhr){
var contentType = xhr.getResponseHeader("Content-Type");
if (xhr.status === 200 && contentType.toLowerCase().indexOf("text/html") >= 0) { //handles session expiration
window.location.reload();
}else{
$('#obtained').val(data);
}
});
服务器确实返回 302,ajax 会跟随该错误到登录页面,并且由于当前代码期望文本/纯内容类型作为“正确”响应,所以它会遇到登录页面中的 text/html,这就是它在重定向后发现,触发 window.location.reload() 进行实际的重定向。
关于jQuery Ajax 的 statusCode 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50300558/