2

您好,我遇到了 ajax json 请求的问题。即使请求成功,我总是会收到错误消息。目前我有这个代码:

function sumbitLoginForm(user, pass) {
    if (user.trim() == '' || pass.trim() == '') {
        alert("You must enter username and password!");
    } else {
        $.ajax({
            type : 'POST',
            url : 'https://url.php',
            dataType : 'json',
            data : {
                userlogin : user,
                userpass : pass
            },
            contentType: "application/json;",
            success : function(data) {
                $("#images").html("uspeshno");
            },
            error : function(data) {
                $("#images").html("greshka");
            }
        });
        }

    return false;
}

$(document).ready(function() {
    clearPageInputs();
    $("#submitButton").click(function() {
        sumbitLoginForm($("#username").val(), $("#password").val());
    });
});

无论我输入什么用户名和密码,我总是出错。但是请求的状态正在改变,如果我输入正确的用户并通过,我会得到状态 302 暂时移动,但是当我输入错误的用户或通过时,我会得到状态 200 OK。我究竟做错了什么 ?

4

1 回答 1

0

PRG 模式和 Ajax

当用户名和密码无法验证时,您的服务器似乎返回了 HTTP 200 状态代码。这是正确的行为,因为 HTTP 错误代码不是针对应用程序错误,而是针对 HTTP 协议错误。

当用户名和密码匹配成功时,您将被重定向到另一个页面。这也是正常行为,例如防止其他人使用返回键重复使用您的登录凭据。

这称为发布/重定向/获取模式。

请参阅:http ://en.wikipedia.org/wiki/Post/Redirect/Get

问题是 PRG 模式不能很好地与 Ajax 应用程序配合使用。重定向应由浏览器处理。因此它对 jQuery 代码是透明的。Ajax html 响应将是 302 的 Location 标头中提到的页面。您的 Ajax 应用程序将无法看到它正在被重定向。所以你被卡住了。

在我的一个项目中,我在服务器端解决了这个问题。如果我检测到 Ajax 调用,我不会发送重定向而是发送正常的 200 响应。这仅在您有权访问服务器代码时才有效。

如果您无法更改 Ajax 调用的重定向,那么您可以解析响应标头或 html 以查看您是否被重定向并采取相应措施。登录可能会设置一个 cookie,因此您可以尝试查找该 cookie 的存在。

于 2012-09-11T11:44:47.567 回答