9

有什么方法可以知道返回的 jqXHR 对象是否是从另一个请求重定向的?例如,具有以下代码:

   jQuery.ajax({
            type:       'POST',
            url:        'http://example.com/page.html',
            complete:   function(response, status) {
                        console.log(response.statusCode);
                        // do something
                        }
        });

如果 ajax url 使用 301 或 302 状态码重定向,则响应将是重定向页面的结果,并将返回 200(OK)状态码。我认为这是一个 jQuery 的错误(真的不知道这是否是预期的行为,因为最终响应实际上是成功的)我无法获得原始响应标头来检查是否存在位置标头,因为这是仅适用于重定向请求。

使用上述代码的 Firebug 通过 XHR 记录这两个请求

http://example.com/page.html 302(暂时移动) http://example.com/redirect.html 200(正常)

但是 jQuery 只返回来自第二个请求的数据。

也许有一种方法可以从第一个请求中获取数据?或者获取响应 URL 并将其与原始请求中的 URL 进行比较?

4

2 回答 2

3

问题是由于标准符合性,301 或 302 由浏览器直接处理。此状态代码不会传递给您的 ajax 调用。您知道调用已完成的唯一方法是在完成处理程序中,此外,传递给完成的 jqxhr 对象中没有给出有用的状态。Success 和 Error 处理程序永远不会被调用。

我们有一些遗留的 ruby​​ camping 代码在调用 post() 方法时使用重定向到 get() 方法,以便我们可以通过资源的 ruby​​ 显示更新的视图。当我们从 camping 视图切换到 JavaScript 视图时,301/302 没有传递给 jqxhr 对象。我们不得不重写 post 方法以返回 200 来解决问题。

这是有关该主题的一些stackoverflow帖子。

如何在 jQuery Ajax 调用后管理重定向请求

在 JavaScript 中捕获 302 FOUND

HTTP 重定向:301(永久)与 302(临时)

于 2011-08-02T22:35:18.083 回答
0

我发现可能有帮助的一个工具是wireshark。它是免费的,并且可能能够找出 jqXHR 对象发生了什么。它相当容易使用,但请遵循以下说明:

http://www.wireshark.org/ Wireshark 是一个适用于 Unix 和 Windows 的网络协议分析器。到目前为止,我只用这个工具刷过表面,但是在分析你的机器和网络上其他人之间的请求时它会派上用场。

开始之前 - Wireshark 会捕获每个请求,因此只有在准备好捕获时单击开始,完成后单击停止。- 你需要你的 IP 地址

阅读有关分析 HTTP 请求的更多信息

于 2011-08-02T05:37:31.943 回答