2015-02-07 109 views
2

我的Ajax代碼是:AJAX就緒狀態reachs 4,但狀態始終是200

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和鉻和ie,但在safari我總是得到狀態200. 我使用safari 5.1.7。我也使用response.setStatus而不是response.sendError,但它不起作用。有人知道爲什麼會發生這種情況嗎?

回答

3

您需要在servlet上設置響應服務器端的狀態。

AJAX客戶端將得到響應並在xhr.status上存儲狀態碼。

它應該是一個有效的HTTP status code

不要忘記在提交響應和發送任何頭文件之前必須設置響應代碼。

您可能想要使用HttpServletResponse#setStatusHttpServletResponse#sendError來這樣做。

或者您可能想要在web.xml中定義一個錯誤頁面。退房:How to set HTTP status code in JSP error handlers

1

我認爲這是因爲您使用非標準的http法規。您應該拋出錯誤的正確類型4xx或5xx(請參閱http status codes),因爲此代碼在HTTP protocol中有實際意義,然後在響應正文中爲您的錯誤設置自定義代碼。

總之,不應該使用http響應的狀態碼發送自己的狀態碼,因爲它違反了協議,並可能導致中間件服務器(如高速緩存服務器)出現問題。