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

Jør*_*gen 100 javascript jquery

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

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

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

Ole*_*leg 92

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

沉默的(透明)重定向的部分XMLHttpRequest规范(见这里特别将"...透明跟随重定向...").标准仅提到用户代理(Web浏览器)可以阻止或通知某些类型的自动重定向,但它不是其中的一部分XMLHttpRequest.它是HTTP客户端配置(操作系统配置)或Web浏览器配置的一部分.所以jQuery.ajax不能有任何阻止重定向的选项.

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

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

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.ajax或级别XMLHttpRequest.

  • 出色的答案和卓越的见解!我有一些curl的经验,你可以设置类似的标志.我希望这些说明可以传递给浏览器,但是根据你的回答,我理解预期的行为是遵循重定向,就好像初始请求被发送到服务器分配的位置一样. (2认同)

Jak*_*sel 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)
Run Code Online (Sandbox Code Playgroud)


Tak*_*man 10

我找到了一项功能,可以检查您的呼叫是否已被重定向.它是xhr.state():如果它被"拒绝",那么就会发生重定向.

成功回调的示例:

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

错误回调示例:

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


小智 -4

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

X-Requested-With    XMLHttpRequest
Run Code Online (Sandbox Code Playgroud)

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