programing

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

skycolor 2023. 7. 31. 21:16
반응형

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

저는 jQuery agax 함수를 사용하여 웹 서비스에 액세스하지만 서버는 문제를 설명하는 상태 코드로 응답을 반환하는 대신 문제를 설명하는 200개의 헤더가 있는 페이지로 요청을 리디렉션합니다.저는 이것을 변경할 수 없어서 어떻게든 고객에게 해결해야 합니다.

예: 요청이 발견되지 않은 일부 URL로 이동하여 302 Redirect를 다른 위치로 수신합니다.새 요청이 전송되고 200 OK를 수신하여 오류 콜백을 방지합니다.

Ajax 요청이 리디렉션을 따르는 것을 방지하고 대신 콜백, 가급적이면 오류 방법을 호출할 수 있는 방법이 있습니까?또는 클라이언트에서 리디렉션이 발생했는지 탐지할 수 있습니까?

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

은 투자리다일다니부입의은음동디션렉명의 입니다.XMLHttpRequest사양(여기, 특히 "... 투명하게 리디렉션을 따릅니다..." 참조).표준은 사용자 에이전트(웹 브라우저)가 특정 종류의 자동 리디렉션을 방지하거나 통지할 수 있다고만 언급하지만, 이는 다음의 일부가 아닙니다.XMLHttpRequestHTTP 클라이언트 구성(OS 구성) 또는 웹 브라우저 구성의 일부입니다.jQuery.ajax리디렉션을 방지할 수 있는 옵션이 없습니다.

의 일부가 프로토콜의 을 알 수.XMLHttpRequest스택의 .", 추화나네트크워즉스택있단것는다입니에계른상다또.를 들어, 를들어, 데의경의 입니다.XMLHttpRequestHTTP 프록시 또는 로컬 브라우저 캐시에서 검색할 수 있으며 HTTP 프로토콜의 일부입니다.대부분 클라이언트가 아닌 데이터를 제공하는 서버가 캐싱에 영향을 미칠 수 있습니다.

질문의 요구 사항을 웹 서버의 IP 주소 변경 또는 통신 중 IP 경로 변경을 방지하기 위한 요구 사항과 비교할 수 있습니다.일부 시나리오에서는 모든 것이 흥미로울 수 있지만, 다른 수준의 통신 스택의 일부가 있으므로 다음을 통해 관리할 수 없습니다.jQuery.ajax또는XMLHttpRequest.

XMLHttpRequest표준은 클라이언트 구성이 리디렉션을 방지하는 옵션을 가질 수 있다고 말합니다.내가 더 잘 아는 "Microsoft world"의 경우, 당신은 설정하는 데 사용할 수 있는 WinHttpSetOption 기능을 볼 수 있습니다.WINHTTP_OPTION_DISABLE_FEATUREWINHTTP_DISABLE_REDIRECTS 또 방법은 치가를 입니다. 또 다른 방법은 사용하는 것입니다.WINHTTP_OPTION_REDIRECT_POLICYWINHTTP_OPTION_REDIRECT_POLICY_NEVERWindows에서 사용할 수 있는 또 다른 기능은 WinHttpSetStatusCallback 함수입니다. 이 함수는 다음과 같은 알림을 받은 콜백 함수를 설정할 수 있습니다.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 무음 리디렉션을 발견했습니다. 사이트에 을 수행하는 코드를 , 응답을 합니다.window.location다른 항목을 수신하면 사이트가 존재하지 않는다는 알림을 사용자에게 제공합니다.

그러나 사이트가 있지만 사용자에게 권한이 없는 경우 쉐어포인트는 자동으로 AccessDenied.aspx 페이지로 리디렉션됩니다.SharePoint는 서버/팜 수준에서 이미 HTTP 401 인증 핸드셰이크를 수행했습니다. 사용자는 SharePoint에 액세스할 수 있습니다.하지만 하위 사이트에 대한 액세스는 일종의 데이터베이스 플래그를 사용하여 처리됩니다.자동 리디렉션은 내 "else" 절을 무시하므로 내 오류를 토할 수 없습니다.저의 경우, 이것은 쇼-스토퍼가 아닙니다. 일관되게 예측 가능한 행동입니다.하지만 조금 놀라웠고, 그 과정에서 HTTP 요청에 대해 알게 되었습니다!

XmlHttpRequests에서 다음 위치 리디렉션을 사용하지 않도록 설정할 수는 없지만 fetch()를 사용하는 경우입니다.

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

나는 같은 것에 관심이 있었고 찾을 수 없었습니다.state()Takman이 언급한 방법은 스스로 약간의 발굴을 했습니다.사람들이 답을 찾기 위해 여기에 오는 것을 위해, 제가 발견한 것은 다음과 같습니다.

여러 번 언급했듯이 리디렉션을 방지할 수는 없지만 탐지할 수는 있습니다.MDN에 따르면 다음을 사용할 수 있습니다.responseURL의 시대의XMLHttpRequestObject여기에는 모든 리디렉션 후 응답이 수신된 최종 URL이 포함됩니다.주의할 점은 Internet Explorer에서 지원되지 않는다는 것입니다(Edge에 있음). xhr/jqXHR에 전달된.success/done jquery의 입니다.XMLHttpRequest그곳에서도 이용할 수 있을 것입니다.

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

당신은 그것을 "거짓"으로 써야 합니다.

이것이 당신의 경우에 적용될지는 모르겠지만, 당신은 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.
        }
    }
});

Ajax 요청의 경우 요청 헤더에 다음이 포함됩니다.

X-Requested-With    XMLHttpRequest

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

언급URL : https://stackoverflow.com/questions/8238727/how-to-prevent-ajax-requests-to-follow-redirects-using-jquery

반응형