使用jQuery执行ajax POST,因为页面需要对用户进行身份验证,有时(当会话到期时),服务器以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或任何其他状态代码中的函数永远不会被触发。
这是否已弃用或我遗失了什么?
谢谢!
答案 0 :(得分:0)
嗯,显然问题在于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 / plain内容类型作为“正确”响应,它会遇到来自登录页面的text / html,这是什么它在重定向后创建,触发window.location.reload()以进行实际的重定向。