使用jQuery的$ .ajax()或$ .getScript()方法时,有何方法来识别重定向?

在我公司的在线应用程序中,我们设置了一个基于JSONP的API,它返回我正在开发的书签使用的一些数据。 这是我设置的快速测试页面,它使用jQuery的$.ajax()方法访问API URL:

http://troy.onespot.com/static/3915/index.html

如果您使用Firebug的“网络”选项卡(或类似)查看请求,您会看到发生的事情是URL已成功请求,但由于我们的应用程序将任何未经授权的用户重定向到登录页面,因此登录页面为也被浏览器请求并且看似解释为JavaScript。 这不可避免地导致exception,因为登录页面是HTML而不是JavaScript。

基本上,我正在寻找任何类型的钩子来确定请求何时导致重定向 – 某种方式来确定URL是否解析为JSONP响应(将执行我在bookmarklet脚本中预定义的方法)或者它导致了重定向。 我尝试在try {} catch(e) {}块中包装$.ajax()方法,但这不会捕获exception,我假设因为请求成功,而不是解析登录页面作为JavaScript。 有没有我可以使用try {} catch(e) {}块,或$.ajax()任何属性,可能允许我磨练exception或以其他方式确定我已被重定向?

我实际上怀疑这是可能的,因为$.getScript() (或$.ajax()的等效设置)只是动态加载脚本,并且无法检查响应头,因为它是跨域而不是真正的AJAX:

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

我的另一种方法是只关闭$.ajax()一段时间,直到我得到JSONP回调或不做,在后一种情况下,假设用户没有登录并提示他们这样做。 但是,我不喜欢这种方法,因为它会导致对应用服务器的大量不必要的请求,并且同时也会堆积JavaScriptexception。

谢谢你的任何建议!

在jQuery中使用AJAX方法时,应该在请求中设置“X-Requested-By:XMLHttpRequest”的标头。

我最初的想法是,您可以检查并查看是否在服务器端设置了该标头,如果是,则不是发出重定向,而是发回一些带有重定向URL的JSON,并让客户端JS查找是否存在响应中的重定向,服务器只在不是AJAXy调用时才发出重定向。

根据jQuery文档,如果你没有像现在那样将dataType指定为脚本,它将尝试根据MIME类型确定响应是什么。 然后,您还可以向$ .ajax方法添加名为dataFilter的选项; 它是一个带有两个参数的函数,dataFilter(数据,类型)和类型是由jQuery确定的数据类型,你可以查看类型并相应地进行处理。