태그 보관물: javascript

javascript

jQuery를 사용하여 리디렉션을 따르도록 Ajax 요청을 방지하는 방법 대신 문제를 설명하는 200 헤더가있는 페이지로

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_FEATUREWINHTTP_DISABLE_REDIRECTSWINHTTP_OPTION_REDIRECT_POLICYWINHTTP_OPTION_REDIRECT_POLICY_NEVERWINHTTP_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 당신은 사용할 수 responseURLXMLHttpRequestObject모든 리디렉션 후 응답에서 나온 최종 URL을 포함 할를. 주의 할 점은 Internet Explorer에서 지원되지 않는다는 것입니다 (Edge에 있음). 때문에 xhr/ jqXHR에 전달 success/ doneJQuery와 함수의 실제의 연장이고 XMLHttpRequest, 너무 거기가 가능해야한다.


답변

두 번째로 리디렉션이 없기 때문에 200 응답을 받았다고 가정합니다. 404 페이지는 만료되지 않기 때문에 캐시에 저장됩니다. 즉, 브라우저가 두 번째로 캐시의 페이지를 제공합니다. ajax jquery에는 속성 “캐시”가 있습니다.
http://api.jquery.com/jQuery.ajax/

“false”로 작성해야합니다.


답변

XmlHttpRequests 에서 위치 리디렉션을 비활성화하는 것은 불가능하지만 fetch ()를 사용할 때입니다 .

fetch('url', {redirect: manual});