jQuery를 사용하여 리디렉션을 따르도록 Ajax 요청을 방지하는 방법


103

jQuery ajax 함수를 사용하여 웹 서비스에 액세스하지만 서버는 문제를 설명하는 상태 코드가있는 응답을 반환하는 대신 문제를 설명하는 200 헤더가있는 페이지로 리디렉션됩니다. 나는 이것을 변경할 수 없으므로 어떻게 든 클라이언트에서 그것을 해결해야합니다.

예 : 요청이 찾을 수없는 일부 URL로 이동하여 다른 위치로 302 리디렉션을 수신합니다. 새 요청이 전송되고 200 OK가 수신되어 오류 콜백이 발생하지 않습니다.

리디렉션을 따르고 대신 콜백, 바람직하게는 오류 메서드를 호출하는 ajax 요청을 방지 할 수있는 방법이 있습니까? 또는 클라이언트에서 리디렉션이 발생했는지 감지 할 수 있습니까?



8
백엔드가 404 대신 찾을 수 없음에 대해 302를보고하는 것이 이상합니다.
Jake Feasel

답변:


96

나는 당신의 질문이 흥미 롭다고 생각하지만 전체적으로 문제는 내가 더 오해하는 것 같습니다. 적어도 나는 문제에 대한 나의 이해를 설명하려고 노력할 것이다.

침묵 (투명) 리디렉션의 일부 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.


2
훌륭한 통찰력으로 훌륭한 답변! 언급 한대로 유사한 플래그를 설정할 수있는 curl에 대한 경험이 있습니다. 이러한 지침이 브라우저에 전달되기를 바랐지만 귀하의 답변에 따르면 예상되는 동작은 마치 초기 요청이 서버에서 할당 한 위치로 전송 된 것처럼 리디렉션을 따르는 것임을 이해합니다.
Jørgen 2011

@ Jørgen : 천만에요! 대부분의 시나리오에서 리디렉션은 전혀 문제가되지 않습니다. jQuery.ajax를 사용하는 컨텍스트와 요청을 보내는 웹 서버에 대한 모든 권한이 있는지 여부는 설명하지 않습니다. 따라서 실제로 문제를 해결할 수있는 다른 조언을 제공하는 것은 어렵습니다.
Oleg

나는 서버 측을 제어하지 않습니다. 내 최선의 선택은 응답 내용을 분석하거나 검증하는 것입니다.
Jørgen 2011

@ Jørgen : 귀하의 경우 리디렉션이 문제가되는 이유는 무엇입니까? 서버가 일부 페이지를 임시 또는 영구적으로 다른 위치로 이동 한 경우 원래 요청을 새 위치로 리디렉션 할 수 있습니다. 절대 OK입니다. 관리자는 예를 들어 서버에서 복원 작업이나 기타 지원 작업 중에 리디렉션을 수행하도록 웹 서버를 구성 할 수 있습니다. DNS가있는 URL로 서버에 요청하면 관리자가 다른 서버로 IP 매핑을 변경할 수 있습니다. 그는 DNS 재구성과 동일한 방식으로 HTTP 리디렉션을 수행 할 수 있습니다. 당신의 문제는 무엇입니까?
Oleg

내 문제는 리디렉션이 일반 오류 페이지로 이동한다는 것입니다. 서버를 다르게 설정해야한다는 것을 알고 있지만 지금은이 상황에 대한 해결책을있는 그대로 찾아야합니다.
Jørgen 2011

23

나는 그것이 가능하다고 믿지 않는다. 기본 라이브러리 (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)

1
감사합니다. 응답을 분석하는 유사한 접근 방식에 만족해야 할 것 같습니다.
Jørgen 2011

11

통화가 리디렉션되었는지 확인하는 기능을 찾았습니다. 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");
    }
});

1
귀하의 답변에있는 팁은 우리가 일을 처리하는 데 정말 도움이되었습니다. 다른 사람에게 도움이되는 참고 사항을 위해 SiteMinder와 보안이 통합 된 WebSphere Portal이 있습니다. 리소스 URL에 대한 Ajax 호출이 필요한 포틀릿이 있으며 시간이 초과되면 투명한 리디렉션이 발생하지만 로그인 페이지로 리디렉션하는 방법에 대한 핸들을 얻을 수 없습니다. jqXHR.state ()가 "거부 됨"인지 확인하는 것이 확실히 도움이되었습니다. 다시 한번 감사드립니다.
Uresh Kuruhuri 2015

그러나 리디렉션에서만 약속이 거부 된 경우에도 "거부 됨"상태가 트리거 될 수 있으므로 오 탐지가있을 수 있습니다. jQuery는 "거부 됨"상태가 언제 전송 되는지
Nitin

1

응답 한 이전 코더의 통찰력있는 지혜를 더할 수는 없지만 다른 사람들이 알아두면 유용 할 수있는 구체적인 사례를 추가하겠습니다.

SharePoint 컨텍스트에서이 302 자동 리디렉션을 발견했습니다. SharePoint 하위 사이트를 핑하는 간단한 Javascript 클라이언트 코드가 있으며 200 HTTP 응답을 받으면 .NET을 통해 해당 사이트로 재배치됩니다 window.location. 다른 것을 수신하면 사이트가 존재하지 않는다는 알림을 사용자에게 제공합니다.

그러나 사이트가 있지만 사용자에게 권한이없는 경우 SharePoint는 자동으로 AccessDenied.aspx 페이지로 리디렉션합니다. SharePoint는 이미 서버 / 팜 수준에서 HTTP 401 인증 핸드 셰이크를 수행했으며 사용자는 SharePoint에 액세스 할 수 있습니다. 그러나 하위 사이트에 대한 액세스는 일종의 데이터베이스 플래그를 사용하여 처리됩니다. 자동 리디렉션은 내 "else"절을 우회하므로 내 자신의 오류를 표시 할 수 없습니다. 제 경우에는 이건 눈에 띄지 않습니다. 일관된 예측 가능한 행동입니다. 그러나 그것은 약간 놀랐고 그 과정에서 HTTP 요청에 대해 배웠습니다!


1

나는 똑같은 것에 관심 이 있었고 Takman이 언급 한state() 방법을 찾을 수 없었고 나 자신을 위해 약간 파고 들었다. 답을 찾기 위해 여기에 올라온 사람들을 위해 여기에 내 결과가 있습니다.

여러 번 언급했듯이 리디렉션을 방지 할 수는 없지만 감지 할 수는 있습니다. 에 따르면 MDN 당신은 사용할 수 responseURLXMLHttpRequestObject모든 리디렉션 후 응답에서 나온 최종 URL을 포함 할를. 주의 할 점은 Internet Explorer에서 지원되지 않는다는 것입니다 (Edge에 있음). 때문에 xhr/ jqXHR에 전달 success/ doneJQuery와 함수의 실제의 연장이고 XMLHttpRequest, 너무 거기가 가능해야한다.


0

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

"false"로 작성해야합니다.


0

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

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

Fetch는 리디렉션 된 URL을 알려주지 않습니다. 동작을 비활성화 할 수 있지만 "redirect : manual"은 사용자가 직접 리디렉션을 처리 할 수 ​​있도록 의도 된 이름이 아닙니다.
lcjury

-2

이것이 귀하의 경우에 적용되는지 확실하지 않지만 AJAX 함수의 특정 상태 코드에 응답하는 코드를 작성할 수 있습니다.

$.ajax({
    url: '/admin/secret/data',
    type: 'POST',
    contentType: 'application/json; charset=utf-8',
    statusCode: {
        200: function (data) {
            alert('302: Occurred');
            // Bind the JSON data to the UI
        },
        401: function (data) {
            alert('401: Occurred');
            // Handle the 401 error here.
        }
    }
});

9
OP 가 백그라운드에서 발생하는 리디렉션으로 인해 항상 200 상태 코드를받는 다고했기 때문에 이것이 적용되지 않는다고 생각합니다 .
Yes Barry

-4

ajax 요청의 경우 요청 헤더에는 다음이 있습니다.

X-Requested-With    XMLHttpRequest

서버 측에서이 기준에 따라 요청을 필터링 할 수 있습니다.


그는 요청이 아닌 응답 을 확인하기를 원했습니다 (그가 이미 제어하고있는 것입니다)
Yes Barry

아마도 Gfox는 3xx를 반환하는 ajax 요청이 무의미하다고 제안했을 수도 있습니다. 예를 들어 이런 종류의 요청을 필터링하고 403을 반환 할 수 있습니다. 양식 인증이 필요한 페이지를 제공하는 웹 사이트가 있고 해당 페이지가 ajax 호출을 수행하고 권한 부여 논리를 한곳에 배치하려는 경우 유효한 대답입니다.
maciejW
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.