如何防止Ajax请求遵循使用jQuery重定向

问题描述 投票:97回答:9

我用jQuery的AJAX功能来访问Web服务,但服务器,而不是返回与描述问题的状态码的响应,该请求被重定向到一个网页,一个200头,描述该问题。我不能让这个任何改变,所以我需要去解决它在客户端上莫名其妙。

例如:请求进入某些URL未找到,因此我接收302重定向到另一个位置。新的请求被发送出去,我收到了200 OK,从而防止错误回调火灾。

有一些方法可以让我避免了Ajax请求进行重定向,而是调用回调,最好的错法。或者,是否有可能检测是否重定向在客户端发生了什么?

javascript jquery
9个回答
92
投票

我觉得你的问题很有趣,但在整个问题似乎我更多的误解。至少我会尽力解释我对这个问题的理解。

沉默的(透明)重定向XMLHttpRequest规范(见here特别是词“...透明跟随重定向...”)的一部分。该标准仅涉及到用户代理(Web浏览器)能够防止某些类型的自动重定向的通知,但它不是XMLHttpRequest的一部分。这是HTTP客户端配置(OS配置)或Web浏览器的配置的一部分。所以jQuery.ajax不能有任何选项,其中可以防止重定向。

你可以看到,HTTP重定向是HTTP协议的一部分,而不是XMLHttpRequest的一部分。因此,它是在抽象的另一个层面或网络堆栈。例如,从XMLHttpRequest的数据可以从HTTP代理或从本地浏览器高速缓存中检索,并且它的HTTP协议的一部分。晴其中提供的数据,而不是客户端可以在缓存影响服务器。

你可以从你的问题与需求相比需求防止Web服务器或者IP路由的通信过程中不断变化的IP地址的变化。所有的东西都可以在某些情况下是有趣的,但也有在通信栈的另一个层面的部分,不能被jQuery.ajaxXMLHttpRequest进行管理。

XMLHttpRequest标准说,客户端配置能够具有防止重定向选项。在“微软的世界”,这是我更好地了解的情况下,你可以看看它可以用来设置与WinHttpSetOptionWINHTTP_OPTION_DISABLE_FEATURE选项WINHTTP_DISABLE_REDIRECTS功能。另一种方式是与WINHTTP_OPTION_REDIRECT_POLICYWINHTTP_OPTION_REDIRECT_POLICY_NEVER选项的使用。还有一个功能,它可以在Windows中使用是可以设置回调函数收到类似WinHttpSetStatusCallback一些通知的WINHTTP_CALLBACK_FLAG_REDIRECT功能。

所以这是做可以实现一般的要求,但解决的办法很可能是不独立于操作系统或Web浏览器,并没有jQuery.ajaxXMLHttpRequest的水平。


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)

9
投票

我发现了一个功能来检查,如果您的电话已被重定向。这是xhr.state():如果是“拒绝”,然后重定向发生。

例如成功的回调:

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");
    }
});

1
投票

我不可能添加到谁已回复以前的编码器的有见地的智慧,但我会添加其他人可能会发现了解有用的特定情况。

我在SharePoint的情况下穿越这302重定向无声的来到。我有一个ping请求的SharePoint子网站的一些简单的JavaScript客户端的代码,如果它收到一个200 HTTP响应,它搬迁到该网站,通过window.location。如果接收到还有什么别的,它为用户提供了一个通知,该网站不存在。

然而,在该网站存在,但用户没有权限的情况下,悄无声息的SharePoint重定向到AccessDenied.aspx页面。的SharePoint已经做好了HTTP 401认证握手在服务器/场级别 - 用户可以访问到SharePoint。但进入子网站被处理,我想使用某种数据库标志。沉默的重定向绕过我的“其他”条款,所以我不能把我自己的错误。在我而言,这是不是表明,塞 - 这是一致的预测行为。但是,这是一个令人感到有点惊讶,我学会了一些在处理HTTP请求!


1
投票

我感兴趣的是同样的事情,再也找不到state()方法mentioned by Takman,做了小挖自己。对于人寻求答案,在这里转动起来的缘故,这里是我的发现:

如前所述多次,你无法阻止重定向,但你可以发现它们。据MDN可以使用responseURL,其中将包含响应来自所有重定向后的最终URL的XMLHttpRequestObject。唯一需要注意的是,它不是由Internet Explorer(边缘有它)的支持。由于传入的jQuery xhr / jqXHR功能success / done是实际XMLHttpRequest的延伸,它应该可以在那里。


0
投票

我想您会收到200响应,因为第二次是没有重定向,因为404页不会过期,它被保存在缓存中。这是说,第二次浏览器给你的页面在缓存中。有一个在阿贾克斯jQuery的属性“缓存”。 http://api.jquery.com/jQuery.ajax/

你应该写为“假”


0
投票

虽然无法禁止在XmlHttpRequests以下位置重定向,它使用fetch()时是:

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

-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.
        }
    }
});

-4
投票

在Ajax请求你将不得不的情况下,请求头以下

X-Requested-With    XMLHttpRequest

通过在服务器端这个标准,你可以过滤请求。

© www.soinside.com 2019 - 2024. All rights reserved.