在使用 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的主要内容,如果未能解决你的问题,请参考以下文章
在使用 jquery .ajax() 重定向的 POST 之后获取实际 URL
Bootstrap Modal 和 Jquery Address ajax 重定向计时问题