如何防止使用jQuery的Ajax请求遵循重定向
我使用jQuery ajax函数访问Web服务,但服务器不是返回带有描述问题的状态代码的响应,而是将请求重定向到带有200头的页面,描述问题。 我无法对此进行任何更改,因此我需要以某种方式在客户端上解决此问题。
例如:请求转到某个未找到的URL,因此我收到一个302重定向到另一个位置。 发送新的请求,并且我收到200 OK,从而防止错误回调触发。
有什么办法可以防止ajax请求跟随重定向,而是调用回调,最好是错误方法。 或者,是否有可能检测客户端是否发生了重定向?
我觉得你的问题很有趣,但总体来说,问题似乎更多的是误解。 至少我会试着解释我对这个问题的理解。
静默(透明)重定向是XMLHttpRequest
规范的一部分(在这里尤其是“...透明地遵循重定向...”)。 该标准只提到用户代理(Web浏览器)可以阻止或通知某些类型的自动重定向,但它不是XMLHttpRequest
的一部分。 这是HTTP客户端配置(OS配置)或Web浏览器配置的一部分。 所以jQuery.ajax
不能有任何可以阻止重定向的选项。
您可以看到HTTP重定向是HTTP协议的一部分,而不是XMLHttpRequest
的一部分。 所以它在另一个抽象层或网络堆栈上。 例如, XMLHttpRequest
的数据可以从HTTP代理或本地浏览器缓存中检索,它是HTTP协议的一部分。 大多数提供数据的服务器而不是客户端可以影响缓存。
您可以将您的问题的要求与防止在通信期间更改Web服务器的IP地址或更改IP路由的要求进行比较。 在某些情况下,所有这些事情都会很有趣,但是通信栈的另一层还有一些部分,不能由jQuery.ajax
或XMLHttpRequest
进行管理。
XMLHttpRequest
标准说客户端配置可以有防止重定向的选项。 在我更了解的“微软世界”的情况下,您可以查看WinHttpSetOption函数,该函数可用于使用WINHTTP_DISABLE_REDIRECTS
值设置WINHTTP_OPTION_DISABLE_FEATURE
选项。 另一种方法是使用WINHTTP_OPTION_REDIRECT_POLICY
选项和WINHTTP_OPTION_REDIRECT_POLICY_NEVER
值。 在Windows中可以使用的另一个功能是WinHttpSetStatusCallback函数,它可以设置回调函数接收一些通知,如WINHTTP_CALLBACK_FLAG_REDIRECT
。
因此,通常可以实现您的需求,但解决方案可能不会独立于操作系统或Web浏览器,并且不在jQuery.ajax
或XMLHttpRequest
的级别。
我不相信这是可能的。 底层库(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)
我找到了一个功能来检查您的电话是否已被重定向。 它是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");
}
});
链接地址: http://www.djcxy.com/p/12431.html
上一篇: How to prevent ajax requests to follow redirects using jQuery