我使用jQuery向我的服务器发送AJAX POST请求,服务器可能会返回带有状态码302的HTTP响应。此后JavaScript只会向该URL发送GET请求,然而我希望将用户重定向到响应中的URL。这是否可能实现?
我使用jQuery向我的服务器发送AJAX POST请求,服务器可能会返回带有状态码302的HTTP响应。此后JavaScript只会向该URL发送GET请求,然而我希望将用户重定向到响应中的URL。这是否可能实现?
答案没有达到预期的效果。我发了一条评论,其中包含一个链接,介绍了如何绕过由浏览器透明处理302问题的黑客技巧:
然而,这是一种比较不规范的方法,在经过多次探索后,我找到了一个我认为更好的解决方案——使用JSON。在这种情况下,你可以让所有的ajax请求响应都有200代码,并且在响应体中加入某种类型的JSON对象,然后你的ajax响应处理程序可以通过这个对象以适当的方式使用它。
作为一项实验,我尝试在各种浏览器(Firefox 3.5、Chrome、IE8、IE7、IE6)中向提供302状态码的服务器发送Ajax请求,并在浏览器的请求对象中显示状态。在每种情况下,它都显示为200。如果响应是HTTP重定向(状态码为301、302、303或307),则必须透明地跟随(除非它违反了安全性或无限循环的预防措施)。任何其他错误(包括401)都必须导致对象使用该错误页面作为响应。
与其让Javascript代码处理302,最好在302事件发生时返回带有自定义错误代码和消息的500。
function doAjaxCall() {
$.ajaxSetup({complete: onRequestCompleted});
$.get(yourUrl,yourData,yourCallback);
}
function onRequestCompleted(xhr,textStatus) {
if (xhr.status == 302) {
location.href = xhr.getResponseHeader("Location");
}
}