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

时间:2011-11-23 07:46:32

标签: javascript jquery

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

实施例: 请求转到某个找不到的URL,因此我收到302重定向到另一个位置。发送一个新请求,我收到200 OK,从而防止错误回调被激活。

是否有某些方法可以阻止ajax请求遵循重定向,而是调用回调,最好是错误方法。或者,是否可以检测客户端中是否发生了重定向?

9 个答案:

答案 0 :(得分:90)

我觉得你的问题很有意思,但整个问题似乎更让我误解了。至少我会试着解释一下我对这个问题的理解。

静默(透明)重定向是XMLHttpRequest规范的一部分(请参阅here,尤其是“......透明地遵循重定向......”)。标准仅提及用户代理(Web浏览器)可以阻止或通知某些类型的自动重定向,但它不是XMLHttpRequest的一部分。它是HTTP客户端配置(操作系统配置)或Web浏览器配置的一部分。因此,jQuery.ajax无法阻止重定向。

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

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

XMLHttpRequest标准表示客户端配置可以具有阻止重定向的选项。如果我更了解“微软世界”,您可以查看WinHttpSetOption函数,该函数可用于设置WINHTTP_OPTION_DISABLE_FEATURE值为WINHTTP_DISABLE_REDIRECTS的选项。另一种方法是使用WINHTTP_OPTION_REDIRECT_POLICY选项和WINHTTP_OPTION_REDIRECT_POLICY_NEVER值。可以在Windows中使用的另一个功能是WinHttpSetStatusCallback功能,它可以设置回调函数,收到一些通知,如WINHTTP_CALLBACK_FLAG_REDIRECT

因此,通常可以实现您的要求,但解决方案可能不会独立于操作系统或Web浏览器,并且不在jQuery.ajaxXMLHttpRequest的级别。< / p>

答案 1 :(得分:23)

我不相信这是可能的。底层库(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)

答案 2 :(得分:9)

我找到了一项功能,可以检查您的通话是否已被重定向。它是xhr.state():如果它被拒绝&#34;然后重定向发生了。

成功回调示例:

request.success(function(data, textStatus, xhr)
{
    if(xhr.state() == "resolved")
    {
        //no redirection
    }
    if(xhr.state() == "rejected")
    {
        //redirection
    }
});

错误回调示例:

request.error(function(xhr, textStatus)
{
    if (xhr.state() == "rejected")
    {
        //redirection
        location.href = "loginpage";
    } else
    {
        //some other error happened
        alert("error");
    }
});

答案 3 :(得分:1)

我不可能增加以前编码者的敏锐智慧,但我会添加一个其他人可能会发现有用的具体案例。

我在SharePoint的上下文中遇到了这个302静默重定向。我有一些简单的Javascript客户端代码可以ping一个SharePoint子站点,如果它收到200个HTTP响应,它会通过window.location重新定位到该站点。如果它收到任何其他内容,它会向用户发出该站点不存在的通知。

但是,如果站点存在但用户没有权限,则SharePoint会以静默方式重定向到AccessDenied.aspx页面。 SharePoint已在服务器/服务器场级别完成HTTP 401身份验证握手 - 用户可以访问SharePoint。但是我想使用某种类型的数据库标志来处理对子站点的访问。静默重定向绕过我的“else”子句,所以我不能抛出自己的错误。在我的情况下,这不是一个显示阻止 - 它是一致的可预测的行为。但这有点令人惊讶,我在这个过程中学到了一些关于HTTP请求的东西!

答案 4 :(得分:1)

我对同样的事感兴趣,找不到state()方法mentioned by Takman,并为自己做了一点挖掘。为了让人们在这里寻找答案,以下是我的发现:

如上所述多次,您无法阻止重定向,但您可以检测到它们。根据{{​​3}},您可以在所有重定向后使用responseURL的{​​{1}},其中包含响应来自的最终网址。唯一需要注意的是Internet Explorer不支持它(Edge有它)。由于传递到jquery的XMLHttpRequestObject / xhr函数的jqXHR / success是实际done的扩展,因此它也应该可用。

答案 5 :(得分:0)

我想您收到200响应,因为第二次没有重定向,因为404页面没有过期,它会保存在缓存中。也就是说,浏览器第二次在缓存中为您提供页面。 有一个属性&#34;缓存&#34;在ajax jquery中。 http://api.jquery.com/jQuery.ajax/

您应该将其写入&#34; false&#34;

答案 6 :(得分:0)

XmlHttpRequests中无法禁用位置重定向,但这是在使用fetch()时:

fetch('url', {redirect: manual});

答案 7 :(得分:-1)

我不确定这是否适用于您的情况,但您可以编写代码来响应AJAX函数中的特定状态代码 -

$.ajax({
    url: '/admin/secret/data',
    type: 'POST',
    contentType: 'application/json; charset=utf-8',
    statusCode: {
        200: function (data) {
            alert('302: Occurred');
            // Bind the JSON data to the UI
        },
        401: function (data) {
            alert('401: Occurred');
            // Handle the 401 error here.
        }
    }
});

答案 8 :(得分:-4)

在ajax请求的请求标头中,您将拥有以下内容

X-Requested-With    XMLHttpRequest

通过服务器端的此条件,您可以过滤请求。