Ajax 요청에서 리디렉션을 감지합니까?


94

jQuery를 사용하여 URL을 가져오고 302 리디렉션으로 응답했는지 명시 적으로 확인하지만 리디렉션을 따르지 않고 싶습니다 .

jQuery $.ajax는 항상 리디렉션을 따르는 것으로 보입니다. 이를 방지하고 따르지 않고 리디렉션을 보려면 어떻게해야합니까?

"jquery ajax redirect"와 같은 제목에 대한 다양한 질문이 있지만 모두 서버가 제공하는 상태를 직접 확인하는 것이 아니라 다른 목표를 달성하는 것과 관련된 것으로 보입니다.

답변:



41

미래에 오신 것을 환영합니다!

지금은 xhr 객체의 "responseURL"속성이 있습니다. 예!

XMLHttpRequest에서 응답 URL을 얻는 방법을 참조하십시오 .

그러나 jQuery (최소 1.7.1)는 XMLHttpRequest 객체에 대한 액세스를 직접 제공하지 않습니다. 다음과 같이 사용할 수 있습니다.

var xhr;
var _orgAjax = jQuery.ajaxSettings.xhr;
jQuery.ajaxSettings.xhr = function () {
  xhr = _orgAjax();
  return xhr;
};

jQuery.ajax('http://test.com', {
  success: function(responseText) {
    console.log('responseURL:', xhr.responseURL, 'responseText:', responseText);
  }
});

깨끗한 솔루션이 아니며 jQuery 팀이 향후 릴리스에서 responseURL에 대해 뭔가를 만들 것이라고 생각합니다.

: 원본 URL을 responseUrl과 비교하십시오. 같으면 리디렉션이 제공되지 않습니다. "정의되지 않음"이면 responseUrl이 지원되지 않을 수 있습니다. 그러나 Nick Garvey가 말했듯이 AJAX 요청은 리디렉션을 따르지 않을 기회가 없지만 responseUrl 속성 을 사용하여 여러 작업을 해결할 수 있습니다.


1
이 속성 ( XHR.responseURL의 MDN 페이지)에 더 많은 리소스를 추가하려면 Edge / 14에서만 추가 된 MSIE에서 일반 지원이 대기중인 것 같습니다.
Eli Collins

감사 ! 매우 유용함
Gautier

이 코드는 실제로 $ .ajax ({url : 'someurl', xhrFields : {withCredentials : true}}) 함수가 $ .ajaxSettings로 확인되는 'this'변수에 의존하기 때문에 Internet Explorer에서 오류를 발생시키는 것으로 나타났습니다. 목적. 그렇지 않은 경우 jQuery는 withCredentials 속성을 지원하지 않는 XMLHttpRequest 개체 대신 ActiveX IXMLHTTPRequest 개체를 만듭니다. xhr = _orgAjax.call ($. ajaxSettings); 호출하여이 문제를 해결했습니다. xhr = _orgAjax (); 대신 누군가에게 도움이되기를 바랍니다.
StephenKC

11

이 질문에 답한 다른 사람들은이 정보가 브라우저에 의해 우리에게 숨겨져 있다는 사실이 (슬프게도) 정확하지만, 제가 생각해 낸 해결 방법을 게시 할 것이라고 생각했습니다.

X-Response-Url요청 된 URL이 포함 된 사용자 지정 응답 헤더 ( ) 를 설정하도록 서버 앱을 구성했습니다 . 내 ajax 코드가 응답을받을 때마다이 xhr.getResponseHeader("x-response-url")정의 되어 있는지 확인 하고,이 경우을 통해 원래 요청한 URL과 비교합니다 $.ajax(). 문자열이 다르면 리디렉션이 있었고 추가로 실제로 도착한 URL이 무엇인지 알고 있습니다.

이것은 서버 측의 도움이 필요하다는 단점이 있으며, 왕복 중에 URL이 뭉쳐지면 (인용 / 인코딩 문제 등으로 인해) 고장날 수 있습니다 ... 그러나 99 %의 경우에는 완료되었습니다.


서버 측에서 필자의 특정 사례는 Pyramid 웹 프레임 워크를 사용하는 Python 애플리케이션이었고 다음 스 니펫을 사용했습니다.

import pyramid.events

@pyramid.events.subscriber(pyramid.events.NewResponse)
def set_response_header(event):
    request = event.request
    if request.is_xhr:
        event.response.headers['X-Response-URL'] = request.url

실제로 리디렉션을 사용하지 않고는 리디렉션이 있는지 알 수있는 방법이 없습니다. 그러나 예상 헤더 URL과 리디렉션 된 URL을 비교하는 것이 현재로서는 해결 방법이 될 수 있습니다. 아이디어 주셔서 감사합니다
Sergio A.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.