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

Tom*_*lls 13 ajax url jquery post redirect

我在我的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: ' + ??);
    },
});
Run Code Online (Sandbox Code Playgroud)

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

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

Tom*_*lls 10

我最后通过在我的所有回复中添加一个额外的标题来解决这个问题(例如"X-MYAPP-PATH:/ Admin/Index").

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

success: function (data, textstatus, xhrreq) {
    alert('You are now at URL: ' + xhrreq.getResponseHeader("X-MYAPP-PATH"));
},
Run Code Online (Sandbox Code Playgroud)

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


小智 5

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

var xhr = new XMLHttpRequest();

$.ajax({
    url: '/url',
    type: 'post',
    data: '...',
    xhr: function() {
         return xhr;
    }
});
Run Code Online (Sandbox Code Playgroud)

然后您可以在任何回调中访问当前URL

success: function () {
    alert('You are now at URL: ' + xhr.responseURL);
}
Run Code Online (Sandbox Code Playgroud)