检测ajax请求中的重定向?

问题描述 投票:0回答:5

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

jQuery 的

$.ajax
似乎总是遵循重定向。我怎样才能防止这种情况,并在不遵循重定向的情况下看到重定向?

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

jquery ajax http
5个回答
93
投票

AJAX 请求永远没有机会不遵循重定向(即它必须遵循重定向)。更多信息可以在这个答案中找到https://stackoverflow.com/a/2573589/965648


49
投票

欢迎来到未来!

现在我们有一个来自 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 进行比较即可。如果相等则没有给出重定向。如果它是“未定义”,则responseUrl可能不受支持。然而,正如 Nick Garvey 所说,AJAX 请求永远没有机会不遵循重定向,但您可以使用 responseUrl 属性来解决许多任务。


14
投票

虽然回答这个问题的其他人(遗憾地)正确地认为浏览器对我们隐藏了这些信息,但我想我应该发布我想出的解决方法:

我配置了我的服务器应用程序以设置包含所请求的 url 的自定义响应标头 (

X-Response-Url
)。每当我的ajax代码收到响应时,它都会检查是否定义了
xhr.getResponseHeader("x-response-url")
,在这种情况下,它将它与最初通过
$.ajax()
请求的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

7
投票

您现在可以使用 fetch API/ 它返回

redirected: *boolean*


0
投票

正如接受的答案中提到的,AJAX 请求永远没有机会不遵循重定向。但我找到了一个可能对某人有帮助的解决方法。

$.ajax("ajax_link_here", {
    data: {},
    contentType: 'application/json',
    type: 'POST',
    success: function (data, textStatus, xhr) {

        // originally this request should return status 200 content type "application/json"
        // ajax requests can not capture status 302 redirect response as browser handles the 302 request automatically
        // so detecting the content type "text/html" which means the request has already redirected

        if (xhr.getResponseHeader("Content-Type").includes('text/html')) {
            // if this section is reached, it means the request has received a 302 redirect response
        }

    }
});
© www.soinside.com 2019 - 2024. All rights reserved.