jQuery Ajax 的 statusCode 问题

标签 jquery ajax

使用 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/

相关文章:

javascript - 在继续循环之前等待 AJAX 完成?

javascript - 更改 html 内容和 url,无需像 Facebook 导航菜单那样重新加载页面

javascript - 将 XMLHttpRequest.responseText 存储到变量中

php - 普通ajax和长轮询的区别

javascript - 打开时,滑出菜单不会在页面中间居中 div

javascript - 将变量传递给 jQuery 函数

jquery - 如何将自定义 CSS 类添加到 Astra Theme for Wordpress 的主菜单按钮

javascript - Jquery .closest() 但我如何在点击其他地方时插入它?

jQuery 同位素 : Hiding items initially

JQUery:根据 AJAX 响应选中或取消选中复选框