jQuery和AJAX响应头

所以我有这个jQuery的AJAX调用,并以302redirect的forms从服务器响应。 我想采取这个redirect并加载到一个iframe中,但是当我尝试查看与JavaScript警报的标题信息,即使萤火虫看到它正确,它会出现null。

这里的代码,如果它会帮助:

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

我真的没有访问服务器端的东西,为了将URL移动到响应正文,我知道这是最简单的解决scheme,所以任何帮助parsing的标题将是太棒了。

cballou的解决scheme将工作,如果你正在使用旧版本的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开始可用。

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

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

如果它不在这个集合中,它必须出现在由服务器返回的Access-Control-Expose-Headers报头中。

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

 Access-Control-Expose-Headers: Location 

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

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

关于AJAX和302redirect的不幸的事实是,你不能从返回中得到头文件,因为浏览器永远不会把它们提供给XHR。 当浏览器看到302时,它会自动应用redirect。 在这种情况下,你会在firebug中看到头文件,因为浏览器得到了它,但是你不会在ajax中看到它,因为浏览器没有通过它。 这就是为什么成功和error handling程序永远不会被调用。 只有完整的处理程序被调用。

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 

这里是关于这个主题的一些stackoverflowpost。 一些post描述黑客来解决这个问题。

如何在jQuery Ajax调用之后pipe理redirect请求

在JavaScript中捕获302 FOUND

HTTPredirect:301(永久)与302(临时)

jQuery使用的基础XMLHttpRequest对象将始终默默遵循redirect,而不是返回302状态码。 因此,您不能使用jQuery的AJAX请求function获取返回的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将被redirect到最终目的地。

尝试这个:

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

+1给PleaseStand,这里是我的其他黑客:

search后发现“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()