jQuery ajax 함수를 사용하여 웹 서비스에 액세스하지만 서버는 문제를 설명하는 상태 코드가있는 응답을 반환하는 대신 문제를 설명하는 200 헤더가있는 페이지로 리디렉션됩니다. 나는 이것을 변경할 수 없으므로 어떻게 든 클라이언트에서 그것을 해결해야합니다.
예 : 요청이 찾을 수없는 일부 URL로 이동하여 다른 위치로 302 리디렉션을 수신합니다. 새 요청이 전송되고 200 OK가 수신되어 오류 콜백이 발생하지 않습니다.
리디렉션을 따르고 대신 콜백, 바람직하게는 오류 메서드를 호출하는 ajax 요청을 방지 할 수있는 방법이 있습니까? 또는 클라이언트에서 리디렉션이 발생했는지 감지 할 수 있습니까?
답변
나는 당신의 질문이 흥미 롭다고 생각하지만 전체적으로 문제는 내가 더 오해하는 것 같습니다. 적어도 나는 문제에 대한 나의 이해를 설명하려고 노력할 것이다.
침묵 (투명) 리디렉션의 일부 XMLHttpRequest
사양 (참조 여기에 “… 투명하게 리디렉션을 따라 …”특히 단어). 표준에서는 사용자 에이전트 (웹 브라우저) 가 특정 종류의 자동 리디렉션을 방지하거나 알릴 수 있다고 만 언급 하지만 XMLHttpRequest
. HTTP 클라이언트 구성 (OS 구성) 또는 웹 브라우저 구성의 일부입니다. 따라서 jQuery.ajax
리디렉션을 방지 할 수있는 옵션이 없습니다.
HTTP 리디렉션이의 일부가 아니라 HTTP 프로토콜의 일부임을 알 수 있습니다 XMLHttpRequest
. 따라서 다른 수준의 추상화 또는 네트워크 스택에 있습니다. 예를 들어의 데이터 XMLHttpRequest
는 HTTP 프록시 또는 로컬 브라우저 캐시에서 검색 할 수 있으며 HTTP 프로토콜의 일부입니다. 대부분 클라이언트가 아닌 데이터를 제공 하는 서버 가 캐싱에 영향을 미칠 수 있습니다.
질문의 요구 사항을 웹 서버의 IP 주소 변경 또는 통신 중 IP 경로 변경을 방지하기위한 요구 사항과 비교할 수 있습니다. 일부 시나리오에서는 모든 것이 흥미로울 수 있지만 다른 수준의 통신 스택 에 일부가 있으며 jQuery.ajax
또는에서 관리 할 수 없습니다 XMLHttpRequest
.
XMLHttpRequest
클라이언트 구성 리디렉션을 방지 옵션을 가질 수있는 표준 말한다. 내가 더 잘 아는 “Microsoft world”의 경우 값으로 옵션 을 설정하는 데 사용할 수있는 WinHttpSetOption 함수를 볼 수 있습니다 . 또 다른 방법은 가치 와 함께 옵션을 사용하는 것입니다 . Windows에서 사용할 수있는 또 하나의 기능은 WinHttpSetStatusCallback 함수로 .WINHTTP_OPTION_DISABLE_FEATURE
WINHTTP_DISABLE_REDIRECTS
WINHTTP_OPTION_REDIRECT_POLICY
WINHTTP_OPTION_REDIRECT_POLICY_NEVER
WINHTTP_CALLBACK_FLAG_REDIRECT
따라서 일반적으로 요구 사항을 구현할 수 있지만 솔루션은 운영 체제 또는 웹 브라우저와 독립적이지 않고 jQuery.ajax
또는 수준이 아닙니다 XMLHttpRequest
.
답변
나는 그것이 가능하다고 믿지 않는다. 기본 라이브러리 (XHR)는 새 요청을 투명하게 만듭니다. 즉, 이러한 상황 (일반적으로 로그인 페이지로 이동하는 세션 시간 초과 유형의 거래)에서 수행 한 작업은 사용자 지정 응답 헤더를 다시 보내는 것입니다. 또한 해당 헤더의 존재를 확인하고 존재할 때 적절하게 응답하는 전역 ajax 핸들러를 설정했습니다 (예 : 전체 페이지를 로그인 화면으로 리디렉션).
관심이있는 경우 해당 사용자 지정 헤더를 확인해야하는 jQuery 코드는 다음과 같습니다.
/* redirects main window when AJAX request indicates that the session has expired on the backend. */
function checkSession(event, xhr, ajaxOptions)
{
if (xhr.readyState == 4)
{
if(xhr.getResponseHeader("Login-Screen") != null && xhr.getResponseHeader("Login-Screen").length)
{
window.location.href='sessionExpired.html'; //whatever
}
}
}
$(document).ajaxComplete(checkSession)
답변
통화가 리디렉션되었는지 확인하는 기능을 찾았습니다. xhr.state ()입니다. “거부 됨”이면 리디렉션이 발생합니다.
성공 콜백의 예 :
request.success(function(data, textStatus, xhr)
{
if(xhr.state() == "resolved")
{
//no redirection
}
if(xhr.state() == "rejected")
{
//redirection
}
});
오류 콜백이있는 예 :
request.error(function(xhr, textStatus)
{
if (xhr.state() == "rejected")
{
//redirection
location.href = "loginpage";
} else
{
//some other error happened
alert("error");
}
});
답변
응답 한 이전 코더의 통찰력있는 지혜를 더할 수는 없지만 다른 사람들이 알아두면 유용 할 수있는 구체적인 사례를 추가하겠습니다.
SharePoint 컨텍스트에서이 302 자동 리디렉션을 발견했습니다. SharePoint 하위 사이트를 핑하는 간단한 Javascript 클라이언트 코드가 있으며 200 HTTP 응답을 받으면 .NET을 통해 해당 사이트로 재배치됩니다 window.location
. 다른 것을 수신하면 사이트가 존재하지 않는다는 알림을 사용자에게 제공합니다.
그러나 사이트가 있지만 사용자에게 권한이없는 경우 SharePoint는 자동으로 AccessDenied.aspx 페이지로 리디렉션합니다. SharePoint는 이미 서버 / 팜 수준에서 HTTP 401 인증 핸드 셰이크를 수행했으며 사용자는 SharePoint에 액세스 할 수 있습니다. 그러나 하위 사이트에 대한 액세스는 일종의 데이터베이스 플래그를 사용하여 처리됩니다. 자동 리디렉션은 내 “else”절을 우회하므로 내 자신의 오류를 표시 할 수 없습니다. 제 경우에는 이건 눈에 띄지 않습니다. 일관된 예측 가능한 행동입니다. 그러나 그것은 약간 놀랐고 그 과정에서 HTTP 요청에 대해 배웠습니다!
답변
나는 똑같은 것에 관심 이 있었고 Takman이 언급 한state()
방법을 찾을 수 없었고 나 자신을 위해 약간 파고 들었다. 답을 찾기 위해 여기에 올라온 사람들을 위해 여기에 내 결과가 있습니다.
여러 번 언급했듯이 리디렉션을 방지 할 수는 없지만 감지 할 수는 있습니다. 에 따르면 MDN 당신은 사용할 수 responseURL
의 XMLHttpRequestObject
모든 리디렉션 후 응답에서 나온 최종 URL을 포함 할를. 주의 할 점은 Internet Explorer에서 지원되지 않는다는 것입니다 (Edge에 있음). 때문에 xhr
/ jqXHR
에 전달 success
/ done
JQuery와 함수의 실제의 연장이고 XMLHttpRequest
, 너무 거기가 가능해야한다.
답변
두 번째로 리디렉션이 없기 때문에 200 응답을 받았다고 가정합니다. 404 페이지는 만료되지 않기 때문에 캐시에 저장됩니다. 즉, 브라우저가 두 번째로 캐시의 페이지를 제공합니다. ajax jquery에는 속성 “캐시”가 있습니다.
http://api.jquery.com/jQuery.ajax/
“false”로 작성해야합니다.
답변
XmlHttpRequests 에서 위치 리디렉션을 비활성화하는 것은 불가능하지만 fetch ()를 사용할 때입니다 .
fetch('url', {redirect: manual});