在 JavaScript 中捕获 302 FOUND

IT技术 javascript jquery ajax http-status-code-302
2021-02-11 18:08:27

我使用 jQuery 向我的服务器发出 AJAX POST 请求,它可以返回状态为 302 的 HTTP 响应。然后 JavaScript 只是向此 URL 发送 GET 请求,而我想将用户重定向到此响应中的 URL。这可能吗?

5个回答

由于给出的原因,接受的答案不起作用。我发布了一条评论,其中包含一个问题的链接,该问题描述了绕过浏览器透明处理 302 的问题的黑客攻击:

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

然而,这是一个肮脏的黑客,经过大量挖掘后,我发现了我认为更好的解决方案 - 使用JSON在这种情况下,您可以使对 ajax 请求的所有响应都包含代码 200,并在响应正文中添加某种 JSON 对象,然后您的 ajax 响应处理程序可以以适当的方式使用该对象。

另一种选择是生成一个错误,但在服务器响应中添加一个自定义标头,您的应用程序可以使用该标头来决定是否将发起 ajax 调用的页面位置更改为 Location 指定的任何位置(或其他任何位置 - 在我的情况下)我只是刷新页面,因为我试图捕捉用户未登录的问题,刷新页面让我的后端 django 使用正常的“login_required”机制来登录用户并将它们返回到页面)
2021-03-29 18:08:27
很多情况下不太适用【如果你有框架处理授权】
2021-04-08 18:08:27
@Steg 我认为这不是一个好的解决方案。如果你有很多ajax调用,是不是每一个ajax函数都要加上检查逻辑?
2021-04-12 18:08:27

我不这么认为。W3C说,HTTP重定向某些状态代码,包括302,必须遵循透明。引用如下:

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

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

在我的问题原因是:

我正在使用localhost/Home/Test地址来测试页面。但是ajax请求代码使用 127.0.0.1/Home/AjaxRequest作为url参数。当 url 不同时,会发生此错误。

也许它可以帮助某人:)

与其要求 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");
   }
}
至少在 FF 中,这不起作用,因为完整的处理程序被调用,最终 HTTP 状态为 200 表示成功重定向(即使 firebug 正确显示 302 响应后跟 200 GET 请求)。
2021-04-01 18:08:27
这不会捕获 302 响应。
2021-04-03 18:08:27
查看帖子stackoverflow.com/questions/199099/...这解释了绕过浏览器自动处理 302 for ajax 响应的一些技巧。
2021-04-08 18:08:27