statusCode

时间:2018-05-11 21:33:53

标签: jquery ajax

使用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或任何其他状态代码中的函数永远不会被触发。

这是否已弃用或我遗失了什么?

谢谢!

1 个答案:

答案 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()以进行实际的重定向。