jquery 判断 重定向url_关于javascript:如何防止ajax请求使用jQuery跟踪重定向

当使用jQuery AJAX访问Web服务时,遇到服务器通过重定向响应错误情况。尽管无法直接阻止AJAX跟随重定向,但可以通过检测响应状态和内容来处理。例如,检查xhr.state()或xhr.responseURL来判断是否发生重定向。此外,可以设置全局AJAX处理器,根据响应头或内容来决定如何响应,如在检测到特定响应头时执行页面重定向。
摘要由CSDN通过智能技术生成

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

例:

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

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

这可能会有所帮助:stackoverflow.com/questions/1804928/handle-jquery-ajax-redirect

奇怪的是,你的后端报告302未找到,而不是404。

防止重定向Xmlhttprequest的可能重复

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

静默(透明)重定向是XMLHttpRequest规范的一部分(请参阅此处特别是"......透明地遵循重定向...")。标准仅提到用户代理(Web浏览器)可以阻止或通知某些类型的自动重定向,但它不是XMLHttpRequest的一部分。它是HTTP客户端配置(操作系统配置)或Web浏览器配置的一部分。所以jQuery.ajax不能有任何可以防止重定向的选项。

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

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

XMLHttpRequest标准表示客户端配置可以具有阻止重定向的选项。对于"Microsoft world",我更了解,您可以查看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级别。

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

@Jrgen:不客气!在大多数情况下,重定向根本不是问题。您没有描述使用jQuery.ajax的上下文以及您是否可以完全控制发送请求的Web服务器。所以很难给你其他可以真正解决问题的建议。

我害怕,我不控制服务器端。我想我最好的选择是分析或验证响应内容。

@Jrgen:为什么重定向在你的情况下是一个问题?如果服务器临时或永久地将某个页面移动到另一个位置,则可以将原始请求重定向到新位置。这绝对没问题。管理员可以将Web服务器配置为执行重定向,例如在服务器上的还原操作期间或任何其他支持工作期间。如果您通过具有DNS的URL询问服务器,则管理员可以将IP映射更改为其他服务器。他可以像DNS重新配置一样进行HTTP重定向。你有什么问题?

我的问题是重定向转到一般错误页面。我知道服务器应该以不同的方式设置,但是现在我需要为这种情况找到解决方案。

@Jrgen:HTTP重定向对于身份验证方案可能非常重要。服务器可以将您重定向到授权服务器。服务器可以是组织的域控制器或Windows联合服务。您将获得Active Directory密码并自行验证。然后,您将在为您尝试从中获取数据的服务器生成的cookie中收到访问令牌。然后,服务器将知道您的权限和您的角色,并将获得您请求的数据。所有这些都是WS-Trust和OAuth标准的一部分。

但是,已知某些浏览器实现(safari)会修改或向重定向请求添加标头,如果添加的标头与服务器的策略不兼容,则会导致错误。

我认为这篇文章具有误导性,在某种程度上,它试图说服务器在响应原始请求时自动"发出"第二个请求,并将响应从第二个自动请求附加到重定向响应。这就像服务器一次返回两个响应,但HTTP 1.1标准明确指出客户端自己发出第二个请求,并且在某些情况下可能选择不进行响应。它与服务器IP更改有很大不同,只是XMLHttpRequest标准的限制。

@snovity:对不起,但问题是:如何通过使用jQuery ajax的一些选项来重定向。答案是:这是不可能的,甚至在基础XMLHttpRequest的层面上也是不可能的。我明白你不喜欢它。我也不喜欢它。但是WinHttpSetOption API(不能在JavaScript中使用,仅存在于Windows上)的使用是我知道阻止重定向的唯一方法。此外,我认为您误解了一件事:重定向使客户端而不是服务器:服务器只返回指令以进行重定向。

这个答案是错的。 XmlHttpRequest是在重定向之后,通过检查Location头,如果存在,则静默地再次调用该url。 XmlHttpRequest正在创建网络套接字,将字节流解释为HTTP协议,并且肯定负责重定向。

@ enorl76:你似乎误解了这个问题。问题是:"如何防止ajax请求使用jQuery跟踪重定向?"。你知道jQuery.ajax的一个选项,它可以阻止jQuery.ajax调用的重定向吗?

我不相信这是可能的。底层库(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");

}

});

答案中的提示确实帮助我们完成了工作。为了有助于其他人的注释,我们让WebSphere Portal将其安全性与SiteMinder集成在一起。我们有一个需要对资源URL进行Ajax调用的portlet,当它超时时,它会发生透明的重定向,但我们无法处理如何重定向到登录页面。检查jqXHR.state()被"拒绝"肯定有帮助。非常感谢再次。

伟大的发现,但是可能存在误报,因为即使承诺被拒绝而不仅仅是重定向,也可以触发"被拒绝"状态。 jQuery解释何时发送"拒绝"状态api.jquery.com/deferred.state

我对同样的事感兴趣,找不到Takman提到的state()方法,并为自己做了一点挖掘。为了让人们在这里寻找答案,以下是我的发现:

如上所述,您无法阻止重定向,但您可以检测到它们。根据MDN,您可以使用XMLHttpRequestObject的responseURL,它将包含所有重定向后响应来自的最终URL。唯一需要注意的是Internet Explorer不支持它(Edge有它)。由于传递到jquery的success / done函数的xhr / jqXHR是实际XMLHttpRequest的扩展,因此它也应该可用。

我不可能增加以前编写回复的编码员的洞察力,但我会添加一个其他人可能会发现有用的具体案例。

我在SharePoint的上下文中遇到了这个302静默重定向。我有一些简单的Javascript客户端代码可以ping一个SharePoint子站点,如果它收到200个HTTP响应,它会通过window.location重新定位到该站点。如果它收到任何其他内容,它会向用户发出该站点不存在的通知。

但是,如果站点存在但用户没有权限,则SharePoint会以静默方式重定向到AccessDenied.aspx页面。 SharePoint已在服务器/服务器场级别完成HTTP 401身份验证握手 - 用户可以访问SharePoint。但是我想使用某种类型的数据库标志来处理对子站点的访问。静默重定向绕过我的"else"子句,所以我不能抛出自己的错误。在我的情况下,这不是一个显示阻止 - 它是一致的可预测的行为。但这有点令人惊讶,我在这个过程中学到了一些关于HTTP请求的东西!

虽然在XmlHttpRequests中无法禁用位置重定向,但是在使用fetch()时:

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

我想你收到200响应,因为第二次没有重定向,因为404页面没有过期,它被保存在缓存中。也就是说,浏览器第二次在缓存中为您提供页面。

ajax jquery中有一个属性"cache"。

http://api.jquery.com/jQuery.ajax/

你应该把它写成"假"

我不确定这是否适用于您的情况,但您可以编写代码来响应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.

}

}

});

我不认为这适用,因为OP说他总是获得200状态代码,因为后台发生了重定向。

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

X-Requested-With    XMLHttpRequest

通过服务器端的此条件,您可以筛选请求。

他想检查响应而不是请求(他已经控制了)

也许Gfox建议对于返回3xx的ajax请求是没有意义的,你可以过滤这种请求并返回403例如。如果你的网站提供需要表单身份验证的页面,而且那些页面也会进行ajax调用,并且你想将授权逻辑放在一个地方,那么对我来说这是一个有效的答案。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值