JavaScript中如何捕获302 FOUND状态码

40

我使用jQuery向我的服务器发送AJAX POST请求,服务器可能会返回带有状态码302的HTTP响应。此后JavaScript只会向该URL发送GET请求,然而我希望将用户重定向到响应中的URL。这是否可能实现?

5个回答

23

答案没有达到预期的效果。我发了一条评论,其中包含一个链接,介绍了如何绕过由浏览器透明处理302问题的黑客技巧:

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

然而,这是一种比较不规范的方法,在经过多次探索后,我找到了一个我认为更好的解决方案——使用JSON。在这种情况下,你可以让所有的ajax请求响应都有200代码,并且在响应体中加入某种类型的JSON对象,然后你的ajax响应处理程序可以通过这个对象以适当的方式使用它。


16
如果您有处理授权的框架,很多情况下就不需要太多适用了。 - naugtur
1
@Steg 我不认为这是一个好的解决方案。如果你有很多ajax调用,你需要在每个ajax函数中添加检查逻辑吗? - smwikipedia
另一个选项是生成一个错误,但在服务器响应中添加一个自定义标题,您的应用程序可以使用它来决定是否更改发起ajax调用的页面的位置为Location指定的任何内容(或其他任何内容 - 在我的情况下我只是刷新页面,因为我试图捕获用户未登录的问题,并且刷新页面使我的后端Django可以使用其正常的“login_required”机制登录并将其返回到页面)。 - Kasapo

6
我不这么认为。根据W3C的规定,HTTP重定向(状态码为301、302、303或307)必须被透明地跟随(除非它违反了安全性或无限循环的预防措施)。以下是引用部分:

如果响应是HTTP重定向(状态码为301、302、303或307),则必须透明地跟随(除非它违反了安全性或无限循环的预防措施)。任何其他错误(包括401)都必须导致对象使用该错误页面作为响应。

作为一项实验,我尝试在各种浏览器(Firefox 3.5、Chrome、IE8、IE7、IE6)中向提供302状态码的服务器发送Ajax请求,并在浏览器的请求对象中显示状态。在每种情况下,它都显示为200。

2
在我的问题中,原因是:
我在测试页面时使用了 localhost/Home/Test 地址。但 ajax 请求代码使用 127.0.0.1/Home/AjaxRequest 作为 url 参数。当这些 url 不同时,就会出现这个错误。
也许对某些人有帮助 :)

-1

与其让Javascript代码处理302,最好在302事件发生时返回带有自定义错误代码和消息的500。


-5
function doAjaxCall() {
   $.ajaxSetup({complete: onRequestCompleted});
   $.get(yourUrl,yourData,yourCallback);
}

function onRequestCompleted(xhr,textStatus) {
   if (xhr.status == 302) {
      location.href = xhr.getResponseHeader("Location");
   }
}

4
至少在 Firefox 中,这并不起作用,因为完整的处理程序会使用最终的 HTTP 状态进行调用,对于成功的重定向,它是 200(即使 Firebug 正确显示了 302 响应后跟随的 200 GET 请求)。 - o_o
1
请查看此帖子:https://dev59.com/AnVC5IYBdhLWcg3wvT1a。这解释了一种绕过浏览器自动处理ajax响应中的302的方法。 - Steg
3
这无法捕获302响应。 - h--n

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接