我用jQuery的AJAX功能来访问Web服务,但服务器,而不是返回与描述问题的状态码的响应,该请求被重定向到一个网页,一个200头,描述该问题。我不能让这个任何改变,所以我需要去解决它在客户端上莫名其妙。
例如:请求进入某些URL未找到,因此我接收302重定向到另一个位置。新的请求被发送出去,我收到了200 OK,从而防止错误回调火灾。
有一些方法可以让我避免了Ajax请求进行重定向,而是调用回调,最好的错法。或者,是否有可能检测是否重定向在客户端发生了什么?
我觉得你的问题很有趣,但在整个问题似乎我更多的误解。至少我会尽力解释我对这个问题的理解。
沉默的(透明)重定向XMLHttpRequest
规范(见here特别是词“...透明跟随重定向...”)的一部分。该标准仅涉及到用户代理(Web浏览器)能够防止某些类型的自动重定向的通知,但它不是XMLHttpRequest
的一部分。这是HTTP客户端配置(OS配置)或Web浏览器的配置的一部分。所以jQuery.ajax
不能有任何选项,其中可以防止重定向。
你可以看到,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
的水平。
我不相信这是可能的。底层库(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");
}
});
我不可能添加到谁已回复以前的编码器的有见地的智慧,但我会添加其他人可能会发现了解有用的特定情况。
我在SharePoint的情况下穿越这302重定向无声的来到。我有一个ping请求的SharePoint子网站的一些简单的JavaScript客户端的代码,如果它收到一个200 HTTP响应,它搬迁到该网站,通过window.location
。如果接收到还有什么别的,它为用户提供了一个通知,该网站不存在。
然而,在该网站存在,但用户没有权限的情况下,悄无声息的SharePoint重定向到AccessDenied.aspx页面。的SharePoint已经做好了HTTP 401认证握手在服务器/场级别 - 用户可以访问到SharePoint。但进入子网站被处理,我想使用某种数据库标志。沉默的重定向绕过我的“其他”条款,所以我不能把我自己的错误。在我而言,这是不是表明,塞 - 这是一致的预测行为。但是,这是一个令人感到有点惊讶,我学会了一些在处理HTTP请求!
我感兴趣的是同样的事情,再也找不到state()
方法mentioned by Takman,做了小挖自己。对于人寻求答案,在这里转动起来的缘故,这里是我的发现:
如前所述多次,你无法阻止重定向,但你可以发现它们。据MDN可以使用responseURL
,其中将包含响应来自所有重定向后的最终URL的XMLHttpRequestObject
。唯一需要注意的是,它不是由Internet Explorer(边缘有它)的支持。由于传入的jQuery xhr
/ jqXHR
功能success
/ done
是实际XMLHttpRequest
的延伸,它应该可以在那里。
我想您会收到200响应,因为第二次是没有重定向,因为404页不会过期,它被保存在缓存中。这是说,第二次浏览器给你的页面在缓存中。有一个在阿贾克斯jQuery的属性“缓存”。 http://api.jquery.com/jQuery.ajax/
你应该写为“假”
虽然无法禁止在XmlHttpRequests以下位置重定向,它使用fetch()时是:
fetch('url', {redirect: manual});
我不知道这是否会在你的情况下适用,但你可以编写代码来对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.
}
}
});
在Ajax请求你将不得不的情况下,请求头以下
X-Requested-With XMLHttpRequest
通过在服务器端这个标准,你可以过滤请求。