복붙노트

[JQUERY] JQuery와 아약스 호출 후 리디렉션 요청을 관리하는 방법

JQUERY

JQuery와 아약스 호출 후 리디렉션 요청을 관리하는 방법

해결법


  1. 1.나는이 질문을 읽고 투명하게 리디렉션을 처리 브라우저를 방지하기 위해 278에 대한 응답의 HTTP 상태 코드를 설정에 관한 언급 된 접근 방식을 구현했습니다. 이 일을해도, 나는 그것이 해킹의 비트가로 조금 불만이었다.

    나는이 질문을 읽고 투명하게 리디렉션을 처리 브라우저를 방지하기 위해 278에 대한 응답의 HTTP 상태 코드를 설정에 관한 언급 된 접근 방식을 구현했습니다. 이 일을해도, 나는 그것이 해킹의 비트가로 조금 불만이었다.

    더 주위를 파고 후, 나는이 방법과 사용 JSON을 따 돌렸다. 이 경우, AJAX 요청에 대한 모든 응답은 상태 코드 200 응답의 몸이 서버에 구축 된 JSON 개체를 포함합니다. 클라이언트의 자바 스크립트는 그것을 할 필요가 무엇을 결정하는 JSON 객체를 사용할 수 있습니다.

    나는 당신과 비슷한 문제가 있었다. 새로운 페이지로 브라우저를 리디렉션 한하고 새 현재 페이지에서 기존 HTML 양식을 대체 한 : 나는이 개 가능 응답이있는 AJAX 요청을 수행합니다. 이 작업을 수행하는 jQuery 코드는 다음과 같은 :

    $.ajax({
        type: "POST",
        url: reqUrl,
        data: reqBody,
        dataType: "json",
        success: function(data, textStatus) {
            if (data.redirect) {
                // data.redirect contains the string URL to redirect to
                window.location.href = data.redirect;
            } else {
                // data.form contains the HTML for the replacement form
                $("#myform").replaceWith(data.form);
            }
        }
    });
    

    data.redirect 및 data.form 다음 JSON 객체 "데이터는"이 명 회원을 가지고 서버에 구성됩니다. 나는이 방법이 더 나은 것으로 판명.


  2. 2.나는이 문제를 해결 :

    나는이 문제를 해결 :


  3. 3.어떤 브라우저는 정확하게 301 개, 302 응답을 처리하지 않습니다. 그리고 사실 표준은 심지어 그들이 "투명하게"아약스 라이브러리 공급 업체에 대한 대규모 두통 인을 처리해야했다. RA-아약스에서 우리는 투명하게 처리하는 서버에서 리디렉션 할 HTTP 응답 상태 코드 278 (그냥 "사용되지 않는"성공 코드)를 사용하여 강제로했다 ...

    어떤 브라우저는 정확하게 301 개, 302 응답을 처리하지 않습니다. 그리고 사실 표준은 심지어 그들이 "투명하게"아약스 라이브러리 공급 업체에 대한 대규모 두통 인을 처리해야했다. RA-아약스에서 우리는 투명하게 처리하는 서버에서 리디렉션 할 HTTP 응답 상태 코드 278 (그냥 "사용되지 않는"성공 코드)를 사용하여 강제로했다 ...

    이건 정말 날 귀찮게하고, 여기에 누군가가 우리가 정말 (301 개, 302) 코드에게 자신을 처리 할 필요가 W3C의 노하우를 할 수 있다는 것을 부탁드립니다 W3C 나는 약간의 "풀"을 가지고 있다면 ...! ;)


  4. 4.결국 구현 된이 솔루션은 Ajax 호출의 콜백 기능과 반환 된 HTML 청크의 특정 요소의 존재에 대해이 래퍼 검사에서 래퍼를 사용하는 것이 었습니다. 요소는 다음 발견 된 경우 래퍼는 리디렉션을 실행. 그렇지 않은 경우, 래퍼는 실제 콜백 함수에 대한 호출을 전달.

    결국 구현 된이 솔루션은 Ajax 호출의 콜백 기능과 반환 된 HTML 청크의 특정 요소의 존재에 대해이 래퍼 검사에서 래퍼를 사용하는 것이 었습니다. 요소는 다음 발견 된 경우 래퍼는 리디렉션을 실행. 그렇지 않은 경우, 래퍼는 실제 콜백 함수에 대한 호출을 전달.

    예를 들어, 우리의 래퍼 함수 뭔가를 같이했다 :

    function cbWrapper(data, funct){
        if($("#myForm", data).length > 0)
            top.location.href="login.htm";//redirection
        else
            funct(data);
    }
    

    Ajax 호출을 할 때 다음, 우리는 무언가를 같이 사용 :

    $.post("myAjaxHandler", 
           {
            param1: foo,
            param2: bar
           },
           function(data){
               cbWrapper(data, myActualCB);
           }, 
           "html"
    );
    

    모든 아약스는 항상 우리가 페이지의 일부를 대체하기 위해 사용하는 DIV 요소 안에 HTML을 반환 호출하기 때문에 우리를 위해 일했다. 또한, 우리는 로그인 페이지로 리디렉션 할 필요가 있었다.


  5. 5.나는 레몬의 약간의 트위스트와 함께 Timmerz의 방법 등이있다. 당신이 JSON을 예상 할 때 당신이 이제까지 text / html과의 ContentType을 반환받을 경우에, 당신은 가장 가능성 리디렉션되고있다. 내 경우에는, 난 그냥 단순히 페이지를 다시로드, 그것은 로그인 페이지로 리디렉션됩니다. 아, 그리고 확인 jqXHR 상태는 오류 기능에 있기 때문에 오른쪽, 바보 보인다, 200이라고? 그렇지 않으면, 합법적 인 오류의 경우는 (죄송합니다) 반복적 인 재로드를 강제로

    나는 레몬의 약간의 트위스트와 함께 Timmerz의 방법 등이있다. 당신이 JSON을 예상 할 때 당신이 이제까지 text / html과의 ContentType을 반환받을 경우에, 당신은 가장 가능성 리디렉션되고있다. 내 경우에는, 난 그냥 단순히 페이지를 다시로드, 그것은 로그인 페이지로 리디렉션됩니다. 아, 그리고 확인 jqXHR 상태는 오류 기능에 있기 때문에 오른쪽, 바보 보인다, 200이라고? 그렇지 않으면, 합법적 인 오류의 경우는 (죄송합니다) 반복적 인 재로드를 강제로

    $.ajax(
       error:  function (jqXHR, timeout, message) {
        var contentType = jqXHR.getResponseHeader("Content-Type");
        if (jqXHR.status === 200 && contentType.toLowerCase().indexOf("text/html") >= 0) {
            // assume that our login has expired - reload our current page
            window.location.reload();
        }
    
    });
    

  6. 6.낮은 수준의 $의 아약스 () 호출을 사용합니다 :

    낮은 수준의 $의 아약스 () 호출을 사용합니다 :

    $.ajax({
      url: "/yourservlet",
      data: { },
      complete: function(xmlHttp) {
        // xmlHttp is a XMLHttpRquest object
        alert(xmlHttp.status);
      }
    });
    

    리디렉션이 시도 :

    if (xmlHttp.code != 200) {
      top.location.href = '/some/other/page';
    }
    

  7. 7.난 그냥이 누군가 도움이 될 수있는 나의 접근 방식을 공유하고 싶었 :

    난 그냥이 누군가 도움이 될 수있는 나의 접근 방식을 공유하고 싶었 :

    나는 기본적으로 사용자 이름과도 로그인 페이지로 리디렉션을 처리하는이 사건을 표시하는 것처럼 인증 물건을 처리하는 자바 스크립트 모듈을 포함.

    내 시나리오 : 우리는 기본적으로 사이에 ISA 서버가 모든 요청과 응답 302와 우리의 로그인 페이지로 위치 헤더에있는 수신합니다.

    내 자바 스크립트 모듈에서 내 초기 접근 방식은 같은했다

    $(document).ajaxComplete(function(e, xhr, settings){
        if(xhr.status === 302){
            //check for location header and redirect...
        }
    });
    

    수행하는 방법 :이 문제는 (많은 여기에 이미 언급) 브라우저 핸들 내 ajaxComplete 콜백이 호출되지있어 어찌하여 그 자체로 리디렉션, 대신 내가 분명히 문제 상태 (200)이었다 이미 재 로그인 페이지의 응답을 얻었다는 점이다 당신은 성공적인 200 응답이 실제 로그인 페이지하거나 다른 임의의 페이지입니다 여부를 감지?

    나는 302 개 리디렉션 응답을 캡처 할 수 없습니다 때문에, 나는 로그인 페이지 자체의 URL을 포함 내 로그인 페이지에 LoginPage 헤더를 추가했다. 모듈에서 지금 헤더를 수신하고 리디렉션을 수행합니다

    if(xhr.status === 200){
        var loginPageRedirectHeader = xhr.getResponseHeader("LoginPage");
        if(loginPageRedirectHeader && loginPageRedirectHeader !== ""){
            window.location.replace(loginPageRedirectHeader);
        }
    }
    

    ... 그리고 : 마법처럼 그 작동합니다. 나는 LoginPage 헤더의 URL을 포함하는 이유는 XHR 객체의 자동 위치 리디렉션으로 발생 GET의 URL을 결정하는 방법을 찾을 수 없습니다 때문에 잘 기본적으로 ... 궁금 할 것이다 ...


  8. 8.이 주제는 오래 알고,하지만 난주지 또 다른 방법은 내가 발견 이전에 여기에 설명했습니다. 기본적으로 내가 WIF와 ASP.MVC을 사용하고 있습니다 (하지만이 주제의 맥락 정말 중요하지 않습니다 - 대답하는 것은 어떤 프레임 워크에 상관없이 사용 적합 단서의 숙박은 변경 -. 아약스 요청을 수행하는 동안 인증 실패에 관련된 문제를 다루는 ).

    이 주제는 오래 알고,하지만 난주지 또 다른 방법은 내가 발견 이전에 여기에 설명했습니다. 기본적으로 내가 WIF와 ASP.MVC을 사용하고 있습니다 (하지만이 주제의 맥락 정말 중요하지 않습니다 - 대답하는 것은 어떤 프레임 워크에 상관없이 사용 적합 단서의 숙박은 변경 -. 아약스 요청을 수행하는 동안 인증 실패에 관련된 문제를 다루는 ).

    (그들은 분명히 beforeSend 이벤트를 재정의하지 않는 경우) 아래에 표시된 방법은 상자 밖으로 모든 아약스 요청에 적용 할 수 있습니다.

    $.ajaxSetup({
        beforeSend: checkPulse,
        error: function (XMLHttpRequest, textStatus, errorThrown) {
            document.open();
            document.write(XMLHttpRequest.responseText);
            document.close();
        }
    });
    

    어떤 아약스 요청이 수행 CheckPulse 방법을 호출하기 전에 (컨트롤러 방법을 아무것도 간단한 될 수있는) :

    [Authorize]
    public virtual void CheckPulse() {}
    

    사용자가 인증되지 않은 경우 (토큰이 만료) 등의 방법으로 액세스 할 수없는 (권한 부여 속성에 의해 보호됨). 토큰이 만료하면서 워크 핸들 인증이므로, 상기 HTTP 응답 상태 (302)을 둔다. 당신이 당신의 브라우저가 투명하게 302 응답을 처리하지 않으려면, Global.asax에 변화의 응답 상태에서 그것을 잡을 - 예를 들어 200 OK로. 또한, 당신은 (나중에 클라이언트 측에서) 특별한 방법으로 이러한 응답을 처리하도록 지시하는 헤더를 추가 :

    protected void Application_EndRequest()
    {
        if (Context.Response.StatusCode == 302
            && (new HttpContextWrapper(Context)).Request.IsAjaxRequest())
        {                
            Context.Response.StatusCode = 200;
            Context.Response.AddHeader("REQUIRES_AUTH", "1");
        }
    }
    

    마지막으로 클라이언트 측에서 이러한 사용자 정의 헤더를 확인하십시오. 현재의 경우 - 로그온 페이지에 대한 모든 리디렉션을 수행해야합니다 (내 경우에서는 window.location 내 프레임 워크에 의해 자동으로 처리됩니다 요청에서 URL로 대체).

    function checkPulse(XMLHttpRequest) {
        var location = window.location.href;
        $.ajax({
            url: "/Controller/CheckPulse",
            type: 'GET',
            async: false,
            beforeSend: null,
            success:
                function (result, textStatus, xhr) {
                    if (xhr.getResponseHeader('REQUIRES_AUTH') === '1') {
                        XMLHttpRequest.abort(); // terminate further ajax execution
                        window.location = location;
                    }
                }
        });
    }
    

  9. 9.나는이 처리하는 더 좋은 방법은 특히, 기존의 HTTP 프로토콜 응답 코드를 활용하여 무단 (401)라고 생각합니다.

    나는이 처리하는 더 좋은 방법은 특히, 기존의 HTTP 프로토콜 응답 코드를 활용하여 무단 (401)라고 생각합니다.

    나는 그것을 해결하는 방법을 여기에 있습니다 :

    IMO이 더 일반적인 그리고 당신은 몇 가지 새로운 맞춤 사양 / 헤더를 작성하지 않습니다. 또한 기존의 아약스 호출을 수정할 필요가 없습니다.

    편집 : 당 @ 롭의 코멘트 아래, 401 (인증 오류의 HTTP 상태 코드)를 표시해야합니다. 403 자세한 내용에 대한 401 개 권한이 HTTP 응답 대 금지를 참조하십시오. 그래서 그에 따라 적응 - 그 존재와 일부 웹 프레임 워크가 모두 인증 및 권한 부여 오류 (403)를 사용했다. 감사합니다 롭.


  10. 10.나는이 같은 문제를 해결 :

    나는이 같은 문제를 해결 :

    이 아약스 요청에 대한 리디렉션 경우, 공정 반응에 미들웨어를 추가 리디렉션 URL과 정상 응답에 대한 응답을 변경합니다.

    class AjaxRedirect(object):
      def process_response(self, request, response):
        if request.is_ajax():
          if type(response) == HttpResponseRedirect:
            r = HttpResponse(json.dumps({'redirect': response['Location']}))
            return r
        return response
    

    응답이 리디렉션이 포함 된 경우 다음 ajaxComplete에, 그것은 리디렉션, 그래서 브라우저의 위치를 ​​변경해야합니다.

    $('body').ajaxComplete(function (e, xhr, settings) {
       if (xhr.status == 200) {
           var redirect = null;
           try {
               redirect = $.parseJSON(xhr.responseText).redirect;
               if (redirect) {
                   window.location.href = redirect.replace(/\?.*$/, "?next=" + window.location.pathname);
               }
           } catch (e) {
               return;
           }
       }
    }
    

  11. 11.내가 찾은 또 다른 해결책 (당신이 글로벌 동작을 설정하려는 경우에 특히 유용는) statusCode 속성과 함께 $의 .ajaxsetup () 메소드를 사용하는 것입니다. 다른 사람들이 지적처럼, 리디렉션 상태 코드 (300 접수대)를 사용하는 대신 4XX의 상태 코드를 사용하여 리디렉션 클라이언트 측을 처리하지 않습니다.

    내가 찾은 또 다른 해결책 (당신이 글로벌 동작을 설정하려는 경우에 특히 유용는) statusCode 속성과 함께 $의 .ajaxsetup () 메소드를 사용하는 것입니다. 다른 사람들이 지적처럼, 리디렉션 상태 코드 (300 접수대)를 사용하는 대신 4XX의 상태 코드를 사용하여 리디렉션 클라이언트 측을 처리하지 않습니다.

    $.ajaxSetup({ 
      statusCode : {
        400 : function () {
          window.location = "/";
        }
      }
    });
    

    당신이 처리 할 상태 코드 400을 교체합니다. 마찬가지로 이미 401가 승인되지 않은 좋은 아이디어가 될 수 언급했다. 아주 불특정 그리고 내가 (잘못된 로그인 자격 증명 등)보다 구체적인 사례에 대한 (401)를 사용할 수 있기 때문에 나는 400을 사용합니다. 그래서 그 대신 세션 시간이 초과 할 때 4XX 오류 코드를 반환해야합니다 직접 백엔드를 리디렉션하고 당신이 리디렉션 클라이언트 측 처리의. 심지어 backbone.js 같은 프레임 워크와 나를 위해 완벽하게 작동


  12. 12.나는 나를 위해 작품, 어떤 서버 코드 변경이 필요가 ... 단지 육두구의 술을 추가 없다는 간단한 솔루션을 가지고 ...

    나는 나를 위해 작품, 어떤 서버 코드 변경이 필요가 ... 단지 육두구의 술을 추가 없다는 간단한 솔루션을 가지고 ...

    $(document).ready(function ()
    {
        $(document).ajaxSend(
        function(event,request,settings)
        {
            var intercepted_success = settings.success;
            settings.success = function( a, b, c ) 
            {  
                if( request.responseText.indexOf( "<html>" ) > -1 )
                    window.location = window.location;
                else
                    intercepted_success( a, b, c );
            };
        });
    });
    

    나는 HTML 태그의 존재를 확인하지만, 당신은 당신의 로그인 페이지에 존재하는 고유 한 어떤 문자열을 검색하기 위해 같이 IndexOf를 변경할 수 있습니다 ...


  13. 13.주어진 솔루션의 대부분은 추가 헤더 또는 부적절한 HTTP 코드를 사용하여 해결 방법을 사용합니다. 이러한 솔루션은 대부분의 아마 작동하지만 약간 '해키'느낄 것이다. 나는 다른 해결책을 마련했습니다.

    주어진 솔루션의 대부분은 추가 헤더 또는 부적절한 HTTP 코드를 사용하여 해결 방법을 사용합니다. 이러한 솔루션은 대부분의 아마 작동하지만 약간 '해키'느낄 것이다. 나는 다른 해결책을 마련했습니다.

    우리는 401 응답에 리디렉션 (passiveRedirectEnabled = "true"로)로 구성되어 WIF를 사용하고 있습니다. 리디렉션은 (302 / 리디렉션을 실행하지 않습니다 브라우저 이후) AJAX 요청 일을하지 않습니다 정상적인 요청을 처리하지만 경우에 유용합니다.

    당신의 Global.asax에 다음 코드를 사용하면 당신은 AJAX 요청에 대한 리디렉션을 사용하지 않도록 설정할 수 있습니다 :

        void WSFederationAuthenticationModule_AuthorizationFailed(object sender, AuthorizationFailedEventArgs e)
        {
            string requestedWithHeader = HttpContext.Current.Request.Headers["X-Requested-With"];
    
            if (!string.IsNullOrEmpty(requestedWithHeader) && requestedWithHeader.Equals("XMLHttpRequest", StringComparison.OrdinalIgnoreCase))
            {
                e.RedirectToIdentityProvider = false;
            }
        }
    

    이것은 당신이 당신의 자바 스크립트는 다음 페이지를 다시로드하여 처리 할 수있는 AJAX 요청에 대한 401 개 응답을 반환 할 수 있습니다. WIF에 의해 처리됩니다 401 던질 것이다 페이지를 다시로드 (및 WIF하면 로그인 페이지로 사용자를 리디렉션합니다).

    예제 자바 스크립트는 401 오류를 처리합니다 :

    $(document).ajaxError(function (event, jqxhr, settings, exception) {
    
        if (jqxhr.status == 401) { //Forbidden, go to login
            //Use a reload, WIF will redirect to Login
            location.reload(true);
        }
    });
    

  14. 14.이 문제는 ASP.NET MVC RedirectToAction 방법을 사용하여 다음 나타날 수 있습니다. DIV의 응답을 표시하는 양식을 방지하기 위해 당신은 단순히 $ .ajaxSetup와 응답을 incomming에 대한 아약스 응답 필터 어떤 종류의 작업을 수행 할 수 있습니다. 응답이 MVC 재 지정을 포함하는 경우 당신은 JS 측이 식을 평가할 수 있습니다. 아래 JS 예제 코드 :

    이 문제는 ASP.NET MVC RedirectToAction 방법을 사용하여 다음 나타날 수 있습니다. DIV의 응답을 표시하는 양식을 방지하기 위해 당신은 단순히 $ .ajaxSetup와 응답을 incomming에 대한 아약스 응답 필터 어떤 종류의 작업을 수행 할 수 있습니다. 응답이 MVC 재 지정을 포함하는 경우 당신은 JS 측이 식을 평가할 수 있습니다. 아래 JS 예제 코드 :

    $.ajaxSetup({
        dataFilter: function (data, type) {
            if (data && typeof data == "string") {
                if (data.indexOf('window.location') > -1) {
                    eval(data);
                }
            }
            return data;
        }
    });
    

    데이터 인 경우 : "에서는 window.location = '/ 계정 / 로그인'"필터 위에 대신 표시 할 데이터를시키는의 리디렉션을하게 평가하는 것이 및 잡을 것입니다.


  15. 15.블라디미르 Prudnikov와 토마스 한센 말한 함께 퍼팅 :

    블라디미르 Prudnikov와 토마스 한센 말한 함께 퍼팅 :

    이렇게하면 자바 스크립트로 브라우저 치료 성공으로 응답하고, 손을합니다.


  16. 16.

        <script>
        function showValues() {
            var str = $("form").serialize();
            $.post('loginUser.html', 
            str,
            function(responseText, responseStatus, responseXML){
                if(responseStatus=="success"){
                    window.location= "adminIndex.html";
                }
            });     
        }
    </script>
    

  17. 17.시험

    시험

        $(document).ready(function () {
            if ($("#site").length > 0) {
                window.location = "<%= Url.Content("~") %>" + "Login/LogOn";
            }
        });
    

    로그인 페이지에 넣습니다. 이 메인 페이지에 사업부에로드 된 경우, 로그인 페이지 때까지 리디렉션합니다. "#site는"로그인 페이지를 제외한 모든 페이지에있는 사업부의 ID입니다.


  18. 18.대답은 당신이 봄 보안 I를 사용하는 경우 사람들이 제대로 작동하는 동안 LoginUrlAuthenticationEntryPoint을 확장하고 AJAX는 더 강력한 처리하기 위해 특정 코드를 추가 발견했다. 모든 리디렉션 아니라 인증 실패 요격 대부분의 예제. 이것은 내가 작업 할 프로젝트의 바람직하지 않은이었다. 당신은 당신이 캐시 실패한 AJAX 요청을하지 않으려는 경우도 ExceptionTranslationFilter가를 확장하고 캐싱 단계를 제거 할 수있는 "sendStartAuthentication"메소드를 오버라이드 (override) 할 필요를 찾을 수 있습니다.

    대답은 당신이 봄 보안 I를 사용하는 경우 사람들이 제대로 작동하는 동안 LoginUrlAuthenticationEntryPoint을 확장하고 AJAX는 더 강력한 처리하기 위해 특정 코드를 추가 발견했다. 모든 리디렉션 아니라 인증 실패 요격 대부분의 예제. 이것은 내가 작업 할 프로젝트의 바람직하지 않은이었다. 당신은 당신이 캐시 실패한 AJAX 요청을하지 않으려는 경우도 ExceptionTranslationFilter가를 확장하고 캐싱 단계를 제거 할 수있는 "sendStartAuthentication"메소드를 오버라이드 (override) 할 필요를 찾을 수 있습니다.

    예 AjaxAwareAuthenticationEntryPoint :

    public class AjaxAwareAuthenticationEntryPoint extends
        LoginUrlAuthenticationEntryPoint {
    
        public AjaxAwareAuthenticationEntryPoint(String loginUrl) {
            super(loginUrl);
        }
    
        @Override
        public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException {
            if (isAjax(request)) {
                response.sendError(HttpStatus.UNAUTHORIZED.value(), "Please re-authenticate yourself");
            } else {
            super.commence(request, response, authException);
            }
        }
    
        public static boolean isAjax(HttpServletRequest request) {
            return request != null && "XMLHttpRequest".equals(request.getHeader("X-Requested-With"));
        }
    }
    

    출처 : 1, 2,


  19. 19.내 login.php 페이지에 다음을 넣어이 문제를 해결했다.

    내 login.php 페이지에 다음을 넣어이 문제를 해결했다.

    <script type="text/javascript">
        if (top.location.href.indexOf('login.php') == -1) {
            top.location.href = '/login.php';
        }
    </script>
    

  20. 20.@Steg 설명 나를 그냥 다시 문제를 인용하자

    @Steg 설명 나를 그냥 다시 문제를 인용하자

    이럴이 진정한 도전하고 공식적으로 현재의 HTTP 표준을 확장해야합니다.

    나는 새 HTTP 표준 새 상태 코드를 사용하는 것입니다 생각합니다. 의미한다 : 현재 삼공 일 삼공이 가서 새 위치로이 요청의 컨텐츠를 취득 할 수있는 브라우저를 알려줍니다.

    (308) (단지 예) 다음, 브라우저가 설치된 위치에 메인 페이지로 리디렉션한다 : 확장 된 표준에있어서, 상기 응답 상태에있는 경우라고한다.

    그 존재는 말했다; 이미 모방이 미래의 행동을 기울어 야하고, document.redirect이 필요하므로 때, I는 서버 응답 등이 있습니다

    status: 204 No Content
    x-status: 308 Document Redirect
    x-location: /login.html
    

    상기 X 상태의 존재, 그 검사 : JS는 "204 상태"지면 (308) 헤더 및 위치 헤더에 제공된 페이지에 document.redirect을한다.

    이 당신에게 어떤 의미가 있습니까?


  21. 21.일부는 유용 아래를 찾을 수 있습니다 :

    일부는 유용 아래를 찾을 수 있습니다 :

    나는 클라이언트가 인증 토큰없이 전송되는 모든 나머지 액션의 로그인 페이지로 리디렉션하고 싶었다. 내 나머지-모든 작업이 아약스를 기반으로하기 때문에, 내가 대신 아약스 성공 기능을 처리하는 로그인 페이지로 리디렉션하는 것이 일반적인 방법이 필요했습니다.

    이것은 내가 무슨 짓을했는지 있습니다 :

    어떤 아약스에 내 서버가 JSON (200) 응답 (클라이언트가 필요한 경우 인증 할) "NEED에 인증"을 반환합니다 요청합니다.

    자바 (서버 측)에서 간단한 예 :

    @Secured
    @Provider
    @Priority(Priorities.AUTHENTICATION)
    public class AuthenticationFilter implements ContainerRequestFilter {
    
        private final Logger m_logger = LoggerFactory.getLogger(AuthenticationFilter.class);
    
        public static final String COOKIE_NAME = "token_cookie"; 
    
        @Override
        public void filter(ContainerRequestContext context) throws IOException {        
            // Check if it has a cookie.
            try {
                Map<String, Cookie> cookies = context.getCookies();
    
                if (!cookies.containsKey(COOKIE_NAME)) {
                    m_logger.debug("No cookie set - redirect to login page");
                    throw new AuthenticationException();
                }
            }
            catch (AuthenticationException e) {
                context.abortWith(Response.ok("\"NEED TO AUTHENTICATE\"").type("json/application").build());
            }
        }
    }
    

    내 자바 스크립트에서 나는 다음과 같은 코드를 추가했습니다 :

    $.ajaxPrefilter(function(options, originalOptions, jqXHR) {
        var originalSuccess = options.success;
    
        options.success = function(data) {
            if (data == "NEED TO AUTHENTICATE") {
                window.location.replace("/login.html");
            }
            else {
                originalSuccess(data);
            }
        };      
    });
    

    그리고 그것에 대해입니다.


  22. 22.서블릿에서 당신은 넣어한다 것은 response.setStatus (response.SC_MOVED_PERMANENTLY); 당신이 리디렉션에 필요한 '301'XMLHTTP 상태를 보낼 수 ...

    서블릿에서 당신은 넣어한다 것은 response.setStatus (response.SC_MOVED_PERMANENTLY); 당신이 리디렉션에 필요한 '301'XMLHTTP 상태를 보낼 수 ...

    그리고 $ 아약스 기능에 당신이로 .toString () 함수를 사용하지 말아야 ... 단지

    경우 (xmlHttp.status == 301) { top.location.href = 'xxxx.jsp'; }

    문제는, 당신은 당신이 리디렉션 할 위치를 결정할 수없는 매우 유연하지입니다 ..

    서블릿을 통해 리디렉션하는 가장 좋은 방법이 될 것이다. 하지만 난 여전히 그것을 할 수있는 올바른 방법을 찾을 수 없습니다.


  23. 23.난 그냥 전체 페이지에 대한 아약스 요청에 래치 싶었다. @SuperG 날 시작되었다. 여기에 내가 함께 끝난 것입니다 :

    난 그냥 전체 페이지에 대한 아약스 요청에 래치 싶었다. @SuperG 날 시작되었다. 여기에 내가 함께 끝난 것입니다 :

    // redirect ajax requests that are redirected, not found (404), or forbidden (403.)
    $('body').bind('ajaxComplete', function(event,request,settings){
            switch(request.status) {
                case 301: case 404: case 403:                    
                    window.location.replace("http://mysite.tld/login");
                    break;
            }
    });
    

    내가 특별히 내 의사 결정의 기준으로 특정 HTTP 상태 코드를 확인하고 싶었다. 그러나, 당신은 단지 성공 이외 얻을 ajaxError에 바인딩 할 수 난 그냥 쓴 수있다 (단, 아마 200?) :

    $('body').bind('ajaxError', function(event,request,settings){
        window.location.replace("http://mysite.tld/login");
    }
    

  24. 24.당신은 또한 다음 값을 전달하려는 경우에도 세션 변수 액세스를 설정할 수 있습니다 예 : 당신의 JSP에서는 쓸 수 있습니다

    당신은 또한 다음 값을 전달하려는 경우에도 세션 변수 액세스를 설정할 수 있습니다 예 : 당신의 JSP에서는 쓸 수 있습니다

    <% HttpSession ses = request.getSession(true);
       String temp=request.getAttribute("what_you_defined"); %>
    

    그리고 당신은 당신의 자바 스크립트 변수에이 임시 값을 저장하고 주위를 재생할 수 있습니다


  25. 25.나는 헤더 솔루션으로 어떤 성공을하지 않았다 - 그들은 내 ajaxSuccess / ajaxComplete 방법에 포착되지 않았다. 나는 사용자 지정 응답이 긴요 함의 답변을 사용하지만, 나는 몇 가지 측면 JS를 수정했습니다. I 설정 I 표준 $의 갔지와 $ .post 방법을 사용할 수 있도록 내가 각 기능에서 호출하는 방법.

    나는 헤더 솔루션으로 어떤 성공을하지 않았다 - 그들은 내 ajaxSuccess / ajaxComplete 방법에 포착되지 않았다. 나는 사용자 지정 응답이 긴요 함의 답변을 사용하지만, 나는 몇 가지 측면 JS를 수정했습니다. I 설정 I 표준 $의 갔지와 $ .post 방법을 사용할 수 있도록 내가 각 기능에서 호출하는 방법.

    function handleAjaxResponse(data, callback) {
        //Try to convert and parse object
        try {
            if (jQuery.type(data) === "string") {
                data = jQuery.parseJSON(data);
            }
            if (data.error) {
                if (data.error == 'login') {
                    window.location.reload();
                    return;
                }
                else if (data.error.length > 0) {
                    alert(data.error);
                    return;
                }
            }
        }
        catch(ex) { }
    
        if (callback) {
            callback(data);
        }
    }
    

    사용 그것의 예 ...

    function submitAjaxForm(form, url, action) {
        //Lock form
        form.find('.ajax-submit').hide();
        form.find('.loader').show();
    
        $.post(url, form.serialize(), function (d) {
            //Unlock form
            form.find('.ajax-submit').show();
            form.find('.loader').hide();
    
            handleAjaxResponse(d, function (data) {
                // ... more code for if auth passes ...
            });
        });
        return false;
    }
    

  26. 26.마지막으로, 사용자 지정 HTTP 헤더를 추가하여 문제를 해결한다. 그냥 서버 측의 모든 요청에 ​​대한 응답하기 전에 내가 응답의 헤더에 현재 요청 된 URL을 추가합니다.

    마지막으로, 사용자 지정 HTTP 헤더를 추가하여 문제를 해결한다. 그냥 서버 측의 모든 요청에 ​​대한 응답하기 전에 내가 응답의 헤더에 현재 요청 된 URL을 추가합니다.

    서버에서 내 응용 프로그램 유형은 Asp.Net MVC이며, 그것을 할 수있는 좋은 장소가 있습니다. Global.asax에에서 나는의 Application_EndRequest 이벤트를 수 있도록 구현 :

        public class MvcApplication : System.Web.HttpApplication
        {
    
        //  ...
        //  ...
    
            protected void Application_EndRequest(object sender, EventArgs e)
            {
                var app = (HttpApplication)sender;
                app.Context.Response.Headers.Add("CurrentUrl",app.Context. Request.CurrentExecutionFilePath);
            }
    
        }
    

    그것은 나를 위해 완벽하게 작동합니다! 이제 JQuery와 $의 모든 응답에 난 상태 (302), (303)에 의해 POST 방식의 결과로 온다 또한 요청 된 URL 및 기타 응답 헤더가 .post ....

    및 기타 중요한 것은 서버 측이나 클라이언트 측 코드를 수정할 필요가 없다는 것이다.

    그 다음 사후 조치 이러한 오류 메시지의 기타 정보에 접근 할 수있는 기능이며, ..., 이런 식으로.

    나는이, 어쩌면 도움이 사람을 게시 :)


  27. 27.내가 만지고 그러는거야 장고 응용 프로그램에서이 문제 가졌다 (면책 조항 : 나는 배우고 만지고 그러는거야, 그리고 어떠한 방식으로 전문가에서이다). 내가하고 싶었던 것은 다음 (기본적으로) 홈페이지에 리디렉션 다시 보내 서버 측에서 삭제, 자원에 DELETE 요청을 보낼 사용 jQuery를 아약스이었다. 내가 파이썬 스크립트 ( '/ 더 - 리디렉션 /') HttpResponseRedirect를 보냈을 때, jQuery의 아약스 방법 대신에 302 정도의 (200)를 수신하고, 내가 한 일은 300의 응답을 보낼 수 있었다 :

    내가 만지고 그러는거야 장고 응용 프로그램에서이 문제 가졌다 (면책 조항 : 나는 배우고 만지고 그러는거야, 그리고 어떠한 방식으로 전문가에서이다). 내가하고 싶었던 것은 다음 (기본적으로) 홈페이지에 리디렉션 다시 보내 서버 측에서 삭제, 자원에 DELETE 요청을 보낼 사용 jQuery를 아약스이었다. 내가 파이썬 스크립트 ( '/ 더 - 리디렉션 /') HttpResponseRedirect를 보냈을 때, jQuery의 아약스 방법 대신에 302 정도의 (200)를 수신하고, 내가 한 일은 300의 응답을 보낼 수 있었다 :

    response = HttpResponse(status='300')
    response['Location'] = '/the-redirect/' 
    return  response
    

    그럼 난 / 전송과 같이 jQuery.ajax와 클라이언트의 요청을 처리 :

    <button onclick="*the-jquery*">Delete</button>
    
    where *the-jquery* =
    $.ajax({ 
      type: 'DELETE', 
      url: '/resource-url/', 
      complete: function(jqxhr){ 
        window.location = jqxhr.getResponseHeader('Location'); 
      } 
    });
    

    어쩌면 (300)를 사용하여 "오른쪽"아니지만, 적어도 내가 그것을 원한처럼 일했다.

    추신 :이 SO의 모바일 버전에 대한 편집에 큰 고통이었다. 내가 내 대답은 함께 할 때 바보 ISP 오른쪽 통해 내 서비스 취소 요청을 넣어!


  28. 28.또한 XMLHttpRequest를 보내기 프로토 타입을 연결할 수 있습니다. 모든이의 의지 작업은 하나의 핸들러 (jQuery를 / 도장 / 등)를 전송한다.

    또한 XMLHttpRequest를 보내기 프로토 타입을 연결할 수 있습니다. 모든이의 의지 작업은 하나의 핸들러 (jQuery를 / 도장 / 등)를 전송한다.

    나는 500 페이지에 오류가 만료 처리하기 위해이 코드를 작성하지만, 200 리디렉션 트랩 마찬가지로 잘 작동합니다. 준비 readyState가의 의미에 대한 XMLHttpRequest의 onreadystatechange의에 위키 피 디아 항목.

    // Hook XMLHttpRequest
    var oldXMLHttpRequestSend = XMLHttpRequest.prototype.send;
    
    XMLHttpRequest.prototype.send = function() {
      //console.dir( this );
    
      this.onreadystatechange = function() {
        if (this.readyState == 4 && this.status == 500 && this.responseText.indexOf("Expired") != -1) {
          try {
            document.documentElement.innerHTML = this.responseText;
          } catch(error) {
            // IE makes document.documentElement read only
            document.body.innerHTML = this.responseText;
          }
        }
      };
    
      oldXMLHttpRequestSend.apply(this, arguments);
    }
    

  29. 29.또한 당신은 아마 헤더 URL에 주어진로 사용자를 리디렉션 할 것입니다. 그래서 결국이 같은 외모 것이다 :

    또한 당신은 아마 헤더 URL에 주어진로 사용자를 리디렉션 할 것입니다. 그래서 결국이 같은 외모 것이다 :

    $.ajax({
        //.... other definition
        complete:function(xmlHttp){
            if(xmlHttp.status.toString()[0]=='3'){
            top.location.href = xmlHttp.getResponseHeader('Location');
        }
    });
    

    UPD : OPPS. 같은 작업을해야하지만 그렇지 작동합니다. 이 물건을. 나는 그것을 찾을 때 나는 당신에게 해결책을 보여 드리겠습니다.


  30. 30.나는 @ 존과 @Arpad 링크 및 @RobWinch 링크에서 답변을 사용하여 작업 solulion있어

    나는 @ 존과 @Arpad 링크 및 @RobWinch 링크에서 답변을 사용하여 작업 solulion있어

    나는 봄 보안 3.2.9와 jQuery를 1.10.2을 사용합니다.

    단지 AJAX 요청에서 원인 4XX 응답에 봄의 클래스를 확장 :

    public class CustomLoginUrlAuthenticationEntryPoint extends LoginUrlAuthenticationEntryPoint {
    
        public CustomLoginUrlAuthenticationEntryPoint(final String loginFormUrl) {
            super(loginFormUrl);
        }
    
        // For AJAX requests for user that isn't logged in, need to return 403 status.
        // For normal requests, Spring does a (302) redirect to login.jsp which the browser handles normally.
        @Override
        public void commence(final HttpServletRequest request,
                             final HttpServletResponse response,
                             final AuthenticationException authException)
                throws IOException, ServletException {
            if ("XMLHttpRequest".equals(request.getHeader("X-Requested-With"))) {
                response.sendError(HttpServletResponse.SC_FORBIDDEN, "Access Denied");
            } else {
                super.commence(request, response, authException);
            }
        }
    }
    

    ApplicationContext를-security.xml

      <security:http auto-config="false" use-expressions="true" entry-point-ref="customAuthEntryPoint" >
        <security:form-login login-page='/login.jsp' default-target-url='/index.jsp'                             
                             authentication-failure-url="/login.jsp?error=true"
                             />    
        <security:access-denied-handler error-page="/errorPage.jsp"/> 
        <security:logout logout-success-url="/login.jsp?logout" />
    ...
        <bean id="customAuthEntryPoint" class="com.myapp.utils.CustomLoginUrlAuthenticationEntryPoint" scope="singleton">
            <constructor-arg value="/login.jsp" />
        </bean>
    ...
    <bean id="requestCache" class="org.springframework.security.web.savedrequest.HttpSessionRequestCache">
        <property name="requestMatcher">
          <bean class="org.springframework.security.web.util.matcher.NegatedRequestMatcher">
            <constructor-arg>
              <bean class="org.springframework.security.web.util.matcher.MediaTypeRequestMatcher">
                <constructor-arg>
                  <bean class="org.springframework.web.accept.HeaderContentNegotiationStrategy"/>
                </constructor-arg>
                <constructor-arg value="#{T(org.springframework.http.MediaType).APPLICATION_JSON}"/>
                <property name="useEquals" value="true"/>
              </bean>
            </constructor-arg>
          </bean>
        </property>
    </bean>
    

    다음과 같이 내하는 JSP에서 글로벌 AJAX 오류 처리기를 추가

      $( document ).ajaxError(function( event, jqxhr, settings, thrownError ) {
          if ( jqxhr.status === 403 ) {
              window.location = "login.jsp";
          } else {
              if(thrownError != null) {
                  alert(thrownError);
              } else {
                  alert("error");
              }
          }
      });
    

    또한, JSP 페이지에서 AJAX 호출에서 오류 처리기를 기존의 제거 :

            var str = $("#viewForm").serialize();
            $.ajax({
                url: "get_mongoDB_doc_versions.do",
                type: "post",
                data: str,
                cache: false,
                async: false,
                dataType: "json",
                success: function(data) { ... },
    //            error: function (jqXHR, textStatus, errorStr) {
    //                 if(textStatus != null)
    //                     alert(textStatus);
    //                 else if(errorStr != null)
    //                     alert(errorStr);
    //                 else
    //                     alert("error");
    //            }
            });
    

    나는 다른 사람을 도움이되기를 바랍니다.

    갱신 1 나는 형태-로그인 설정에 옵션 (항상 사용 기본 대상 = "true"로)를 추가 할 필요가 있음을 발견했다. 이는 AJAX 요청이 (인해 만료 된 세션에) 로그인 페이지로 이동, 봄은 로그인 후에 이전 AJAX 요청 및 자동 리디렉션을 기억 도착 후부터 필요했다. 이 반환 된 JSON은 브라우저 페이지에 표시됩니다. 물론, 내가 원하지 않는 것을.

    갱신 2 대신 항상 사용 기본 대상 = "true"로는 requstCache에서 AJAX 요청을 차단 사용 @RobWinch 예제를 사용하여의. 이것은 정상적인 링크가 로그인 후 원래 목표로 리디렉션 할 수 있지만, AJAX는 로그인 후 홈페이지로 이동합니다.

  31. from https://stackoverflow.com/questions/199099/how-to-manage-a-redirect-request-after-a-jquery-ajax-call by cc-by-sa and MIT license