在使用 jquery .ajax() 重定向的 POST 之后获取实际 URL

Posted

技术标签:

【中文标题】在使用 jquery .ajax() 重定向的 POST 之后获取实际 URL【英文标题】:Getting the actual URL after a POST which redirected using jquery .ajax() 【发布时间】:2011-09-02 10:52:11 【问题描述】:

我在我的 Web 应用程序中遵循 PRG(Post-Redirect-Get)模式,并使用类似以下的方式来完成我的大部分 POST:

$.ajax(
    type: 'POST',
    url: 'A.html',
    data: '....',
    statusCode: 
        302: function() 
            alert("302"); // this is never called
        ,
        200: function() 
            alert("200");
        ,
    ,
    success: function (data, textstatus) 
        alert('You are now at URL: ' + ??);
    ,
    error: function (data) 
    ,
    complete: function (jqXHR, textstatus) 
        alert('You are now at URL: ' + ??);
    ,
);

我需要在发生任何重定向后获取 URL,即 .ajax() 函数调用的最终 GET 的 URL。例如,到 A.html 的 POST 可能会重定向到 B.html 或 C.html(总是通过 302)。如何获得最终 URL?

我正在使用 jquery 1.5.1,并且使用代理见证了 jquery 默默地跟踪重定向 - 我很满意。我不关心响应 302 的任何 URL - 我只想知道 .ajax() 的“success:”或“complete:”钩子被触发时最终请求的 URL。

【问题讨论】:

发送带有数据的 url 并在 success ajax 的一部分中检索 您能否详细说明该示例,并指定是否发生嵌套重定向。用这个例子详细说明——例如,到 A.html 的 POST 可能会重定向到 B.html 或 C.html(总是通过 302)。如何获得最终到达网址? 我已使用代理确认 POST 到 A.html 的响应是“302 Found”和位置:B.html。然而,问题的症结在于我无法查询 javascript/jquery 以获得任何证据表明我在任何地方都被重定向到 B.html。如果我问 $(this).url 我会得到“A.html”,window.location 等也是如此。 【参考方案1】:

更好的解决方案是为 jQuery 的 ajax 提供一个自定义的 xhr 对象,如下所示:

var xhr = new XMLHttpRequest();

$.ajax(
    url: '/url',
    type: 'post',
    data: '...',
    xhr: function() 
         return xhr;
    
);

然后就可以在任意回调中访问当前的URL了

success: function () 
    alert('You are now at URL: ' + xhr.responseURL);

【讨论】:

【参考方案2】:

我终于解决了这个问题,在我的所有回复中添加了一个额外的标题(例如“X-MYAPP-PATH:/Admin/Index”)。

因此,我的 javascript 可以更改为以下内容:

success: function (data, textstatus, xhrreq) 
    alert('You are now at URL: ' + xhrreq.getResponseHeader("X-MYAPP-PATH"));
,

但是我仍然相信 jquery 应该能够给我当前的 URL,所以我认为这是一个 hack。

【讨论】:

【参考方案3】:

首先尝试找出重定向返回的状态代码(通常 > 300)。

success: function (data, textstatus, xhrReq) 
        //if the status is greater than 300 
        if(xhrReq.status > 300) 
           alert('You are now at URL: ' + xhrRequest.getHeader("Location"));
        
    ,

还有一点需要注意的是执行顺序: 成功\失败 --> statusCode 函数 --> 完成

【讨论】:

不 - jquery 隐藏了 302 的任何证据。xhrreq.status 为 200,xhr.getHeader() 不是可用函数。 @Tom,getHeader 工作正常,但我需要检查 302(也许你是对的 您可以使用xhrReq. getAllResponseHeaders(),但如果Location 不存在,那么您就不走运了。 @TomWells 是正确的,无论如何您都不会得到 302 响应。重定向被浏览器隐藏。

以上是关于在使用 jquery .ajax() 重定向的 POST 之后获取实际 URL的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 ajax jQuery 重定向指定重定向 url

在使用 jquery .ajax() 重定向的 POST 之后获取实际 URL

Bootstrap Modal 和 Jquery Address ajax 重定向计时问题

[转]jquery mobile中redirect重定向问题

本机 ajax 调用不会在 302 上重定向

JQuery Ajax 在不设置 cookie 的情况下自动重定向?