如何防止使用jQuery的redirect的Ajax请求

我使用jQuery的Ajax函数来访问一个Web服务,但是服务器,而不是返回一个描述问题的状态代码的响应,请求被redirect到一个200头,描述问题的页面。 我不能做任何改变,所以我需要在客户端上解决它。

例如:请求转到某个未find的URL,所以我收到一个302redirect到另一个位置。 一个新的请求被发送,我收到一个200 OK,从而防止错误callback触发。

有什么办法可以防止ajax请求跟随redirect,而是调用一个callback,最好是错误的方法。 或者,是否有可能检测客户端是否发生redirect?

我觉得你的问题很有趣,但总体来说,问题似乎更多的是误解。 至less我会试着解释我对这个问题的理解。

静默(透明)redirect是XMLHttpRequest规范的一部分( 在这里尤其是“…透明地遵循redirect…”)。 标准仅提到用户代理(Web浏览器) 可以阻止或通知某些types的自动redirect,但它不是XMLHttpRequest的一部分。 这是HTTP客户端configuration(OSconfiguration)或Web浏览器configuration的一部分。 所以jQuery.ajax不能有任何选项,你可以防止redirect。

您可以看到HTTPredirect是HTTP协议的一部分,而不是XMLHttpRequest的一部分。 所以它在另一个抽象层或networking堆栈上。 例如, XMLHttpRequest的数据可以从HTTP代理或本地浏览器caching中获取,它是HTTP协议的一部分。 大多数提供数据的服务器而不是客户端可以影响caching。

您可以将您的问题的要求与防止在通信期间更改Web服务器IP地址或更改IP路由的要求进行比较。 在某些情况下,所有这些事情都可能是有趣的,但是通信栈另一层有些部分不能被jQuery.ajaxXMLHttpRequestpipe理。

XMLHttpRequest标准说客户端configuration可以有防止redirect的选项。 在“微软世界”的情况下,我更好的了解,你可以看看WinHttpSetOption函数,它可以用来设置WINHTTP_OPTION_DISABLE_FEATURE选项和WINHTTP_DISABLE_REDIRECTS值。 另一种方法是使用WINHTTP_OPTION_REDIRECT_POLICY选项和WINHTTP_OPTION_REDIRECT_POLICY_NEVER值。 WinHttpSetStatusCallback函数可以在Windows中使用另一个function,它可以设置callback函数接收一些像WINHTTP_CALLBACK_FLAG_REDIRECT通知。

所以一般情况下可以实现你的需求,但是这个解决scheme可能并不独立于操作系统或者web浏览器,也不在jQuery.ajax或者XMLHttpRequest的层面。

我不相信这是可能的。 底层库(XHR)透明地创build新的请求。 这就是说,我在这些情况下做了什么(通常是会话超时types的交易,带我到一个login页面)发回一个自定义响应标题。 我还设置了一个全局的ajax处理程序,用于检查是否存在该标题,并在出现时进行相应的响应(例如,将整个页面redirect到login屏幕)。

如果你有兴趣,这里是我必须观看自定义标题的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) 

我发现一个function,检查您的电话已被redirect。 这是xhr.state():如果它被“拒绝”,那么redirect发生了。

成功callback示例:

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

错误callback示例:

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

我想你会收到200响应,因为第二次没有redirect,因为404页面没有过期,它被保存在caching中。 也就是说浏览器第二次给你caching中的页面。 在AJAX jQuery中有一个属性“caching”。 http://api.jquery.com/jQuery.ajax/

你应该把它写成“假”

我不可能增加已经回答的先前编码人员的洞察力,但是我会添加一个其他人可能认为有用的特定情况。

我在SharePoint上下文中遇到了这种302无提示redirect。 我有一些简单的Javascript客户端代码,它会ping一个SharePoint子站点,如果它收到一个200 HTTP响应,它将通过window.location定位到该站点。 如果收到其他内容,则会通知用户网站不存在。

但是,在站点存在但用户没有权限的情况下,SharePoint将以静默方式redirect到AccessDenied.aspx页面。 SharePoint已经在服务器/服务器级别完成了HTTP 401身份validation握手 – 用户可以访问SharePoint。 但是,访问子网站是处理我想使用某种数据库标志。 无声的redirect绕过了我的“其他”条款,所以我不能抛出自己的错误。 在我的情况下,这不是一个表演 – 这是一致的可预见的行为。 但是有点令人惊讶,我在这个过程中学到了一些关于HTTP请求的知识!

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

 $.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 

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