ajax就绪状态达到4但状态始终为200

时间:2015-02-07 08:29:53

标签: ajax jsp servlets safari onreadystatechange

我的ajax代码是:

 xhr.onreadystatechange = function() {
    if (xhr.readyState == 4) {
        alert(xhr.status);
        if (xhr.status == 200) {
            alert("200");               
        }
        else if (xhr.status == 8001) {
            alert("8001");               
        }
        else if (xhr.status == 8000) {
            alert("8000");             
        }
        else if (xhr.status == 7000) {
            alert("7000");                
        }
        else {
            alert("x");              
        }
    }
};
xhr.open("POST","URL",true);
xhr.send(null);

我在xhr.open中解决的页面代码是:

    if (request.getSession().getAttribute("SATI_UID") == null) {
        response.sendError(8000);
    } else {
            response.sendError(8001);
    }

它适用于firefox和chrome,但是在safari中我总是获得状态200。 我使用safari 5.1.7。我也使用response.setStatus代替response.sendError,但它不起作用。 谁知道为什么会这样?

2 个答案:

答案 0 :(得分:3)

您需要在servlet上设置响应服务器端的状态。

AJAX客户端将获得响应并将状态代码存储在xhr.status

它应该是有效的HTTP status code

不要忘记在提交响应并发送任何标头之前必须设置响应代码。

您可能希望使用HttpServletResponse#setStatusHttpServletResponse#sendError来执行此操作。

或者您可能希望在web.xml上定义错误页面。查看:How to set HTTP status code in JSP error handlers

答案 1 :(得分:1)

我认为这是因为您使用非标准的http法规。您应该抛出正确类型4xx或5xx的错误(请参阅http status codes),因为此代码在HTTP protocol中具有真实意义,然后在响应正文中设置您自己的自定义代码错误。

总而言之,http响应的状态代码不应该用于发送您自己的状态代码,因为它会破坏协议并导致中间件服务器(例如缓存服务器)的某些问题。 / p>