在jQuery中检测redirect$ .ajax?

我想使用jQuery来获取一个URL,并明确检查它是否响应302redirect,但遵循redirect。

jQuery的$.ajax似乎总是遵循redirect。 我怎样才能防止这种情况,并看到没有遵循它的redirect?

有像“jquery ajaxredirect”这样的标题有各种各样的问题,但他们似乎都涉及到实现其他目标,而不是直接检查服务器给出的状态。

AJAX请求从来没有机会不遵循redirect(即它必须遵循redirect)。 更多的信息可以在这个答案中findhttps://stackoverflow.com/a/2573589/965648

欢迎来到未来!

现在我们有一个来自xhr对象的“responseURL”属性。 好极了!

请参阅如何获取XMLHttpRequest中的响应URL?

但是,jQuery(至less1.7.1)不直接访问XMLHttpRequest对象。 你可以使用这样的东西:

 var xhr; var _orgAjax = jQuery.ajaxSettings.xhr; jQuery.ajaxSettings.xhr = function () { xhr = _orgAjax(); return xhr; }; jQuery.ajax('http://test.com', { success: function(responseText) { console.log('responseURL:', xhr.responseURL, 'responseText:', responseText); } }); 

这不是一个干净的解决scheme,我想jQuery团队将在未来的版本中为responseURL做些什么。

提示 :将原始url与responseUrl进行比较。 如果它是相等的,那么不会有redirect。 如果它是“未定义”,则可能不支持responseUrl。 但是正如Nick Garvey所说,AJAX请求从来没有机会不遵循redirect,但是你可以通过使用responseUrl属性来解决一些任务。

jQuery在浏览器的JavaScript引擎的范围内运行。 通过javascript或html元素(链接,脚本,图像,audio或video等)请求的每个资源都受到httpredirect的约束。 不幸的是没有办法让JavaScript以您需要的方式访问低级http。

非常抱歉,答案是否定的。

虽然回答这个问题的其他人(可惜)是正确的,这些信息是由浏览器隐藏的,我想我会发布一个解决scheme,我想出了:

我configuration了我的服务器应用程序来设置一个自定义响应头( X-Response-Url )包含请求的url。 每当我的ajax代码收到一个响应,它会检查是否xhr.getResponseHeader("x-response-url") ,在这种情况下,它将它与通过$.ajax()原来请求的url进行比较。 如果string不同,我知道有一个redirect,此外,我们实际上到达了什么url。

这有一个缺点,就是需要一些服务器端的帮助,而且如果在往返过程中url被引入(由于引用/编码问题等),也可能会崩溃…但是对于99%的情况,这似乎得到工作完成。


在服务器端,我的具体情况是使用Pyramid web框架的python应用程序,我使用了以下代码片段:

 import pyramid.events @pyramid.events.subscriber(pyramid.events.NewResponse) def set_response_header(event): request = event.request if request.is_xhr: event.response.headers['X-Response-URL'] = request.url 
 $.ajax({ type: "POST", url: "http://arudhrainnovations.com/android/testregister.php", data: dataString, dataType: "json", cache: false, success: function(result){ alert(result); } } if (result.success==1) { windows.locations = "index.html"; return; } 

在来自活动服务器的json响应之后redirect文件。 检查respon标签success ==1并把下面的代码redirect。

windows.locations =“index.html”;

请通过contact@arudhrainnovations.com告诉我更多详情