JQuery 和 AJAX 响应头

我得到了这个 jQuery AJAX 调用,响应来自服务器,以302重定向的形式。我希望使用这个重定向并在 iframe 中加载它,但是当我试图使用 javascript 警告查看头信息时,它会显示 null,即使 firebug 正确地看到了它。

这是密码,如果有用的话:

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

为了将 URL 移动到响应主体,我实际上并不能访问服务器端的内容,我知道这是最简单的解决方案,所以任何有关解析标题的帮助都是非常棒的。

368110 次浏览

试试这个:

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

如果你使用的是旧版本的 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'));
}
});

根据 docs ,从 jQuery 1.4开始,XMLHttpRequest 对象就可用了。

JQuery总是默默地遵循重定向使用的底层 XMLHttpRequest 对象,而不是返回302状态码。因此,不能使用 jQuery 的 AJAX 请求功能来获取返回的 URL。相反,您需要将所有数据放到一个表单中,并将表单的 target属性设置为 iframe 的 name属性的值:

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

+ 1请起立 这是我的另一招:

在搜索并发现“ 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()

关于 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

这里有一些关于这个主题的堆栈溢出的文章,其中一些文章描述了解决这个问题的方法。

如何管理 jQuery Ajax 调用后的重定向请求

在 JavaScript 中捕获302个发现

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

如果这是一个 CORS 请求,你可以在调试工具中看到所有的头(比如 Chrome-> 检查元素-> 网络) ,但是 xHR 对象只会检索头(通过 xhr.getResponseHeader('Header')) ,如果这样的头是 简单响应头:

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

如果它不在这个集合中,那么它必须出现在服务器返回的 访问-控制-公开-标题头中。

关于这种情况,如果是 CORS 请求,只有当且仅当下面的头也存在时,才能通过 XMLHttpRequest对象检索 Location头:

Access-Control-Expose-Headers: Location

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

2018年 JQuery 3及其后更新

我知道这是一个老问题,但是以上的解决方案对我都不管用。这里有一个有效的解决方案:

//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'));
});
}