175

所以我得到了这个 jQuery AJAX 调用,响应以 302 重定向的形式来自服务器。我想采用此重定向并将其加载到 iframe 中,但是当我尝试使用 javascript 警报查看标头信息时,即使 firebug 正确看到它,它也会显示为 null。

这是代码,如果有帮助的话:

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

我真的无法访问服务器端的东西以将 URL 移动到响应正文,我知道这将是最简单的解决方案,因此任何有关解析标头的帮助都会很棒。

4

8 回答 8

200

如果您使用的是旧版本的 jquery,cballou 的解决方案将起作用。在较新的版本中,您还可以尝试:

  $.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 开始可用。

于 2010-11-21T02:02:06.197 回答
140

如果这是一个CORS 请求xhr.getResponseHeader('Header'),您可能会在调试工具(例如 Chrome->Inspect Element->Network)中看到所有标头,但如果此类标头是简单的响应标头,xHR 对象只会检索标头(通过) :

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

如果不在此集合中,则它必须存在于服务器返回的Access-Control-Expose-Headers标头中。

关于所讨论的情况,如果是 CORS 请求,则只有当且仅当以下标头也存在时,才能Location通过对象检索标头:XMLHttpRequest

Access-Control-Expose-Headers: Location

如果它不是 CORS 请求,XMLHttpRequest则检索它没有问题。

于 2013-03-16T01:07:38.207 回答
38
 var geturl;
  geturl = $.ajax({
    type: "GET",
    url: 'http://....',
    success: function () {
      alert("done!"+ geturl.getAllResponseHeaders());
    }
  });
于 2010-08-07T20:28:56.160 回答
18

关于 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 调用后管理重定向请求

在 JavaScript 中捕获 302 FOUND

HTTP 重定向:301(永久)与 302(临时)

于 2012-02-06T20:30:34.297 回答
10

jQuery 使用的底层 XMLHttpRequest 对象将始终静默地跟随重定向,而不是返回 302 状态代码。因此,您不能使用 jQuery 的 AJAX 请求功能来获取返回的 URL。取而代之的是,您需要将所有数据放入一个表单并提交表单,并将target属性设置为nameiframe 的属性值:

$('#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 会被重定向到最终目的地。

于 2010-11-21T02:24:45.827 回答
9

尝试这个:

type: "GET",
async: false,
complete: function (XMLHttpRequest, textStatus) {
    var headers = XMLHttpRequest.getAllResponseHeaders();
}
于 2009-10-13T00:12:27.453 回答
8

JQUERY 3 及更高版本的 2018 年更新

我知道这是一个老问题,但上述解决方案都不适合我。这是有效的解决方案:

//I only created this function as I am making many ajax calls with different urls and appending the result to different divs
function makeAjaxCall(requestType, urlTo, resultAreaId){
        var jqxhr = $.ajax({
            type: requestType,
            url: urlTo
        });
        //this section is executed when the server responds with no error 
        jqxhr.done(function(){

        });
        //this section is executed when the server responds with error
        jqxhr.fail(function(){

        })
        //this section is always executed
        jqxhr.always(function(){
            console.log("getting header " + jqxhr.getResponseHeader('testHeader'));
        });
    }
于 2018-11-20T10:46:23.537 回答
2

+1 到 PleaseStand,这是我的另一个技巧:

搜索后发现“跨ajax请求”无法从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()  
于 2011-10-10T05:59:54.033 回答