2012-07-20 46 views
5

我们已将我们的身份验证委托给另一个域(窗口标识框架,联合身份验证设置)。现在,如果会话在ajax请求之前超时,服务器将请求重定向到认证服务器。由于它成为一个跨域调用,Ajax请求被浏览器取消。有没有办法,我可以在jQuery/JavaScript中检测到这一点?在ajax请求上检测跨域重定向

我检查了在这种情况下设置为0的xhr对象的status属性,但它是否是取消请求的一个很好的指示器? (我使用jQuery $就使Ajax请求)

+0

为什么要这样做,结果如果你知道你正在执行的URL请求?你不能只在执行ajax请求之前比较当前域和url *吗? – zerkms 2012-07-20 03:33:52

+0

因为它重定向到ajax请求上的一个不同的域,我不知道在哪里检查url,如果jquery确实在重定向上引发任何事件,那么是的,我可以在那里添加该代码。 – Sush 2012-07-22 01:35:06

+0

这里是另一种方式,我可以短语的问题,a)向您的域名ajax请求b)请求“可能”重定向到基于certian conditons的另一个域c)如果它确实重定向,浏览器阻止请求并取消它(因为它是一个跨域调用)c)引发错误事件..所以,问题是我如何检测到请求失败,因为跨域调用? – Sush 2012-07-22 01:47:46

回答

4

我也一直在寻找这个,并且发现很少的证据表明你想检测的是完美可检测。但是,我找到了一种方法来检测它发生的可能是

这里是你的事件会发生什么事:

  1. 的JavaScript代码发起请求。
  2. 浏览器向服务器发出请求。
  3. 服务器以重定向回答。
  4. 浏览器确定新位置是​​不同的域。
  5. 浏览器取消请求(以确保安全)。
  6. 浏览器报告(不完全如实)请求从未发送。

在您的错误回调中,请检查您的XMLHttpRequest对象的readyState字段。如果它是0(“UNSENT”),那么这意味着你的AJAX请求从未被发送过。

当然,它可能并不总是完全清楚为什么它没有发送。例如,用户可能只需拔掉他的网线。但是,如果您愿意假定网络运行正常,那么当您看到readyState == 0时,由于跨域问题,请求也未被发送,因此可以合理假设。这意味着重定向发生了。

如果您正在使用jQuery,那么您可以检查jqXHR.readyState

+0

只是为了确认,因为它不是很明确 - 我已经测试过了,不幸的是readyState如果拔掉网线,也会出现0,并且可能是出现其他网络错误,这意味着您无法区分网络错误和重定向。 – sam 2016-05-23 10:28:52

0

您可以检查此页:http://api.jquery.com/jQuery.ajax/

有一个错误的参数,其中如果请求失败,你可以捕捉。

错误(jqXHR,textStatus,errorThrown)

希望这会有所帮助。

+0

这将如何帮助? – Starx 2012-07-20 03:43:56

+0

只是为了清除你的问题。你想要的是检查你的认证服务器,如果请求是从jQuery或本地JavaScript? – jvicente 2012-07-20 03:52:43

+0

@jvicente你的建议是类似于我在做什么,我有一个全局错误处理程序(即ajaxError(...)而不是本地错误处理程序)incase我附加本地错误处理程序errorThrown参数包含值“找不到”并且textstatus的值为“error”。对于这些值,我不认为我认为请求失败是因为浏览器终止了请求。 – Sush 2012-07-22 01:03:42