2010-12-06 4 views
16

아약스를 통해 제출할 양식이 있습니다. jquery 양식 플러그인을 사용하고 있습니다. 내가 뭘 하려는지 내 서버에서 반환되는 '위치'헤더를 얻을 수 있습니다. 나는 방화범에 그것을 볼 수있다. 내가 성공 콜백의 getResponseHeader() 함수를 호출 할 때마다, 그것은 항상 '정의되지 않은'반환 ..jquery getResponseHeader는 항상 '정의되지 않음'을 반환합니까?

코드 :

form.ajaxForm({ 
    dataType: 'xml', 
    data: {format: 'xml'}, 
    resetForm: true, 
    success: function(xml,status,xhr){ 
    var location = xhr.getResponseHeader('Location'); 
    alert(location); 
    }); 

위치는 정의되지 않습니다. 하지만 '위치'헤더가 불그스작 한 것을 볼 수 있습니다. 내가 뭘 놓치고 있니? 내가 XHR 객체에서 getAllResponseHeaders()를 호출해도, 그것은 최종 요청이 헤더가되지 않도록, 이미 그 리디렉션을 따라 그리고 당신이보고하고,

+0

그냥 추가 : 이것은 파이어 폭스와 오페라에서 테스트되었습니다. 동일한 결과 – demersus

답변

25

이것은 CORS request 경우 이러한 헤더가있는 경우, 당신은 디버그 도구의 모든 헤더를 (예 : 크롬 -로> 엘리먼트 -> 네트워크 검사) 볼 수 있지만, XHR 객체는 (xhr.getResponseHeader('Header')를 통해) 헤더를 검색합니다 simple response header :

  • Content-Type
  • Last-modified
  • Content-Language
  • Cache-Control

는이 세트에 있지 않은 경우

  • Expires
  • 는, 서버에 의해 리턴 된 Access-Control-Expose-Headers 헤더에 존재해야한다. 그것은 CORS 요청을 경우 문제의 경우 약

    , 하나는 단지 XMLHttpRequest 객체의 경우 throgh Location 헤더를 검색 할 수 및 경우에만 아래의 헤더도 존재 :

    Access-Control-Expose-Headers: Location 
    

    CORS 요청이 아닌 경우 XMLHttpRequest은 검색하는 데 문제가 없습니다.

  • +1

    이것은 그 것이었다! * bow * – GijsjanB

    +0

    CORS를 사용해야하고 이러한 문제가 발생하는 경우 정답입니다. –

    6

    XMLHttpRequest를가 transparently follow a redirect 것 '정의되지 않은'반환 응답 헤더는 이고 요청 (Location 헤더를 가진 초기 요청이 아님)입니다.

    +0

    서버에서 생성 된 201 응답을 생성합니다. jquery가 이것을 리디렉션으로 해석하지 않기를 바랍니다. 방화범은 두 번째 요청을 표시하지 않습니다. – demersus

    +0

    @Nik - 그래도 위치 헤더가 있습니다. 맞습니까? 그것은 리디렉션입니다. –

    +0

    위치 헤더가 있지만 http 응답 코드를 이해하면 30x 시리즈는 리디렉션을 의미합니다. 20 배가 아닙니다. 20x는 추가 조치를 의미하지 않습니다. 위치 헤더는 정보 제공 용이어야합니다.하지만 내가 틀렸어? – demersus

    3

    나는 레일즈/휴식 방법을 사용하여 Location 헤더가있는 201 "created"를 새로운 객체와 빈 몸체로 반환하는 방식으로 비슷한 작업을 수행하고 있습니다. jQuery의 ajax 메소드는 json을 기대하지만 이후로는 아무것도 얻지 못하면서 "parseerror"를 던질 것입니다. 나는 단지 다음과 같이 내 오류 콜백에서 201 리디렉션을 잡는다.

    function request_error(req, textStatus, errorThrown) 
    { 
        if (req.status == 201) { 
         var created_loc = req.getResponseHeader('Location'); 
         console.log('(201) created: ' + created_loc); 
    
         // ... manual redirect here i.e. issue another ajax request to created_loc 
         return; 
        } 
    
        // ... handle an actual error here 
    } 
    

    희망이있다.

    +0

    그냥 dataType : 'text'를 arg로 설정하면 완전한 콜백 (또는 더 나은 : jqXHR.done)에서 201을 잡을 수 있습니다. – GijsjanB

    관련 문제