Заголовок ответа jQuery и AJAX

Итак, у меня есть этот вызов jQuery AJAX, и ответ приходит с сервера в виде перенаправления 302. Я хотел бы взять эту переадресацию и загрузить ее в iframe, но когда я пытаюсь просмотреть информацию заголовка с помощью предупреждения javascript, он становится нулевым, хотя firebug видит его правильно.

Вот код, если это поможет:

$j.ajax({
    type: 'POST',
    url:'url.do',
    data: formData,
    complete: function(resp){
        alert(resp.getAllResponseHeaders());
    }
});

У меня нет доступа к серверным материалам, чтобы переместить URL-адрес в тело ответа, что, как я знаю, было бы самым простым решением, поэтому любая помощь в анализе заголовка была бы фантастической.

Ответ 1

Решение cballou будет работать, если вы используете старую версию jquery. В новых версиях вы также можете попробовать:

  $.ajax({
   type: 'POST',
   url:'url.do',
   data: formData,
   success: function(data, textStatus, request){
        alert(request.getResponseHeader('some_header'));
   },
   error: function (request, textStatus, errorThrown) {
        alert(request.getResponseHeader('some_header'));
   }
  });

В соответствии с документами объект XMLHttpRequest доступен как jQuery 1.4.

Ответ 2

Если это запрос CORS, вы можете увидеть все заголовки в инструментах отладки (например, Chrome- > Inspect Element- > Network), но объект xHR будет извлекать только заголовок (через xhr.getResponseHeader('Header')), если такой заголовок представляет собой простой заголовок ответа:

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

Если он не находится в этом наборе, он должен присутствовать в заголовке Access-Control-Expose-Headers, возвращаемом сервером.

В этом случае, если это запрос CORS, вы сможете получить заголовок Location через объект XMLHttpRequest, если и только если заголовок ниже также присутствует:

Access-Control-Expose-Headers: Location

Если у него нет запроса CORS, XMLHttpRequest не будет проблем с его извлечением.

Ответ 3

 var geturl;
  geturl = $.ajax({
    type: "GET",
    url: 'http://....',
    success: function () {
      alert("done!"+ geturl.getAllResponseHeaders());
    }
  });

Ответ 4

Несчастная правда о AJAX и перенаправлении 302 заключается в том, что вы не можете получить заголовки из возврата, потому что браузер никогда не дает их XHR. Когда браузер видит 302, он автоматически применяет перенаправление. В этом случае вы увидите заголовок в firebug, потому что браузер получил его, но вы не увидите его в ajax, потому что браузер не прошел его. Вот почему успех и обработчики ошибок никогда не вызываются. Вызывается только полный обработчик.

http://www.checkupdown.com/status/E302.html

The 302 response from the Web server should always include an alternative URL to which redirection should occur. If it does, a Web browser will immediately retry the alternative URL. So you never actually see a 302 error in a Web browser

Вот несколько статей stackoverflow по этому вопросу. Некоторые из сообщений описывают хаки, чтобы обойти эту проблему.

Как управлять запросом на перенаправление после вызова jQuery Ajax

Поймать 302 НАЙДЕНО в JavaScript

HTTP-перенаправление: 301 (постоянный) против 302 (временный)

Ответ 5

Основной объект XMLHttpRequest, используемый jQuery всегда будет молча следить за перенаправлениями, а не возвращать код состояния 302. Поэтому вы не можете использовать функцию запроса jQuery AJAX для получения возвращаемого URL-адреса. Вместо этого вам нужно поместить все данные в форму и отправить форму с атрибутом target, установленным в значение name атрибута iframe:

$('#myIframe').attr('name', 'myIframe');

var form = $('<form method="POST" action="url.do"></form>').attr('target', 'myIframe');
$('<input type="hidden" />').attr({name: 'search', value: 'test'}).appendTo(form);

form.appendTo(document.body);
form.submit();

Страница сервера url.do будет загружена в iframe, но когда его статус 302 поступит, iframe будет перенаправлен в конечный пункт назначения.

Ответ 6

попробуйте следующее:

type: "GET",
async: false,
complete: function (XMLHttpRequest, textStatus) {
    var headers = XMLHttpRequest.getAllResponseHeaders();
}

Ответ 7

+1 к PleaseStand и вот мой другой хак:

после поиска и обнаружил, что "cross ajax request" не смог получить заголовки ответов из объекта XHR, я сдался. и вместо этого используйте iframe.

1. <iframe style="display:none"></iframe>
2. $("iframe").attr("src", "http://the_url_you_want_to_access")
//this is my aim!!!
3. $("iframe").contents().find('#someID').html()