2015-02-07 3 views
2

내 아약스 코드입니다 :아약스 준비 상태는 4 reachs하지만 상태는 항상 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); 
    } 

그리고 크롬 그리고 ie 그러나 원정 여행에서 나는 항상 상태 200을 얻는다. 나는 사파리를 사용한다 5.1.7. 또한 response.sendError 대신 response.setStatus을 사용하지만 작동하지 않습니다. 왜 이런 일이 발생하는지 알고 있습니까?

답변

3

서블릿에서 응답 서버 측의 상태를 설정해야합니다.

AJAX 클라이언트는 응답을 받고 xhr.status에 상태 코드를 저장합니다.

유효한 HTTP status code으로되어 있습니다.

응답 코드가 설정되고 모든 헤더가 전송되기 전에 응답 코드가 설정되어야한다는 것을 잊지 마십시오.

이렇게하려면 HttpServletResponse#setStatus 또는 HttpServletResponse#sendError을 사용하는 것이 좋습니다.

또는 web.xml에 오류 페이지를 정의 할 수 있습니다. 체크 아웃 : How to set HTTP status code in JSP error handlers

1

나는 비표준 http 법령을 사용하기 때문에 이것이라고 생각합니다. 이 코드는 HTTP protocol에 실제 의미가 있기 때문에 올바른 유형 4xx 또는 5xx (http status codes 참조)의 오류를 던져야하며 응답 본문에 오류에 대한 사용자 지정 코드를 설정해야합니다.

요약하면 HTTP 응답의 상태 코드는 프로토콜을 손상시키고 미들웨어 서버 (예 : 캐싱 서버)에 문제를 일으킬 수 있기 때문에 자신의 상태 코드를 보내지 않아야합니다.