在ajax请求中检测到重定向?


94

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

jQuery $.ajax似乎总是遵循重定向。如何防止这种情况,并且不遵循重定向就可以看到重定向?

标题为“ jquery ajax redirect”的标题存在各种问题,但它们似乎都涉及实现其他目标,而不仅仅是直接检查服务器给出的状态。

Answers:



41

欢迎来到未来!

现在,我们从xhr对象获得了一个“ responseURL”属性。好极了!

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

但是,jQuery(至少1.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);
  }
});

这不是一个干净的解决方案,我想jQuery团队会在将来的版本中为responseURL做些事情。

提示:只需将原始URL与responseUrl进行比较即可。如果相等,则没有重定向。如果它是“ undefined”,则可能不支持responseUrl。但是,正如Nick Garvey所说,AJAX请求永远不会有机会不遵循重定向,但是您可以通过使用responseUrl属性来解决许多任务。


1
要在此属性上添加更多资源 -XHR.responseURL上的MDN页面 -似乎正在等待MSIE的普遍支持,MSIE仅在Edge / 14中添加了它。
伊莱·柯林斯

谢谢 !非常有用
Gautier '18

我发现这段代码实际上使$ .ajax({url:'someurl',xhrFields:{withCredentials:true}})在Internet Explorer中引发错误,因为函数_orgAjax取决于解析为$ .ajaxSettings的'this'变量目的。如果不支持,则jQuery创建一个ActiveX IXMLHTTPRequest对象而不是XMLHttpRequest对象,该对象不支持withCredentials属性。我通过调用xhr = _orgAjax.call($。ajaxSettings)来解决此问题。而不是xhr = _orgAjax(); 我希望这可以帮助别人。
StephenKC

11

尽管回答了这个问题的其他人都(非常)正确地认为浏览器对我们隐藏了此信息,但我认为我应该发布一种解决方法:

我配置了服务器应用程序以设置X-Response-Url包含请求的URL 的自定义响应标头()。每当我的Ajax代码收到响应时,它都会检查是否xhr.getResponseHeader("x-response-url")已定义,在这种情况下,它将其与最初通过所请求的url进行比较$.ajax()。如果字符串不同,我知道有一个重定向,此外,我们实际到达的是哪个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

确实,没有重定向就无法知道是否存在重定向。但现在比较预期的标头URL和重定向的URL可能对我来说是一种解决方法。感谢您的想法
Sergio A.

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.