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()