如何防止ajax请求使用jQuery跟踪重定向

2022-08-30 05:35:30

我使用jQuery ajax函数来访问Web服务,但是服务器不是返回带有描述问题的状态代码的响应,而是将请求重定向到具有200标头的页面,描述问题。我无法对此进行任何更改,因此我需要以某种方式在客户端上解决它。

示例:请求转到某个找不到的URL,因此我收到302重定向到另一个位置。发送了一个新请求,并且我收到一个 200 OK,从而防止触发错误回调。

有没有办法阻止ajax请求跟随重定向,而是调用回调,最好是error方法。或者,是否可以检测客户端中是否发生了重定向?


答案 1

我发现你的问题很有趣,但整个问题似乎更像是一个误解。至少我会试着解释我对这个问题的理解。

静默(透明)重定向是规范的一部分(请参阅此处,特别是“...透明地遵循重定向...“)。该标准仅提到用户代理(Web浏览器)可以阻止或通知某些类型的自动重定向,但它不是 的一部分。它是 HTTP 客户端配置(操作系统配置)或 Web 浏览器配置的一部分。因此,没有任何可以阻止重定向的选项。XMLHttpRequestXMLHttpRequestjQuery.ajax

您可以看到 HTTP 重定向是 HTTP 协议的一部分,而不是 的一部分。所以它在另一个抽象层次或网络堆栈上。例如,可以从 HTTP 代理或本地浏览器缓存中检索来自 的数据,它是 HTTP 协议的一部分。大多数情况下,提供数据而不是客户端的服务器可能会影响缓存。XMLHttpRequestXMLHttpRequest

您可以将问题中的要求与防止更改 Web 服务器的 IP 地址或在通信过程中更改 IP 路由的要求进行比较。在某些情况下,所有事情都可能很有趣,但是通信堆栈的另一个级别的某些部分无法由 或 管理。jQuery.ajaxXMLHttpRequest

标准说客户端配置可以具有阻止重定向的选项。在“微软世界”的情况下,我更清楚,你可以看看WinHttpSetOption功能,它可以用来设置带有值的选项。另一种方法是使用带有值的选项。可以在Windows中使用的另一个功能是WinHttpSetStatusCallback函数,它可以设置回调函数接收一些通知,例如.XMLHttpRequestWINHTTP_OPTION_DISABLE_FEATUREWINHTTP_DISABLE_REDIRECTSWINHTTP_OPTION_REDIRECT_POLICYWINHTTP_OPTION_REDIRECT_POLICY_NEVERWINHTTP_CALLBACK_FLAG_REDIRECT

因此,总体上可以实现您的要求,但解决方案可能不独立于操作系统或Web浏览器,并且不在或的级别上。jQuery.ajaxXMLHttpRequest


答案 2

我认为这是不可能的。基础库 (XHR) 以透明方式发出新请求。话虽如此,在这些情况下(通常是将我带到登录页面的会话超时类型的交易)我所做的是发回自定义响应标头。我还设置了一个全局ajax处理程序,用于检查该标头是否存在,并在存在时做出适当的响应(例如,将整个页面重定向到登录屏幕)。

如果您有兴趣,以下是我必须注意的jQuery代码,以获取该自定义标头:

/* redirects main window when AJAX request indicates that the session has expired on the backend. */
function checkSession(event, xhr, ajaxOptions)
{
    if (xhr.readyState == 4)
    {
        if(xhr.getResponseHeader("Login-Screen") != null && xhr.getResponseHeader("Login-Screen").length)
        {
            window.location.href='sessionExpired.html'; //whatever
        }
    }
}

$(document).ajaxComplete(checkSession)