在 JavaScript 中捕获 302 FOUND

Posted

技术标签:

【中文标题】在 JavaScript 中捕获 302 FOUND【英文标题】:Catching 302 FOUND in JavaScript 【发布时间】:2010-09-27 05:59:12 【问题描述】:

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

【问题讨论】:

【参考方案1】:
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 请求) . 查看帖子***.com/questions/199099/…。这解释了绕过浏览器自动处理 302 for ajax 响应的一些技巧。 这不会捕获 302 响应。【参考方案2】:

我不这么认为。 W3C 表示必须透明地遵循带有某些状态代码(包括 302)的 HTTP 重定向。引用如下:

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

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

【讨论】:

【参考方案3】:

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

How to manage a redirect request after a jQuery Ajax call

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

【讨论】:

很多情况下不太适用[如果你有框架处理授权] @Steg 我认为这不是一个好的解决方案。如果你有很多 ajax 调用,你是否必须在每个 ajax 函数中添加检查逻辑? 另一个选项是生成错误,但在服务器响应中添加一个自定义标头,您的应用程序可以使用该标头来决定是否将启动 ajax 调用的页面的位置更改为 Location 指定的任何内容(或其他任何东西——在我的情况下,我只是刷新页面,因为我试图捕捉用户未登录的问题,刷新页面让我的后端 django 使用它的正常“login_required”机制来记录用户将它们返回到页面)【参考方案4】:

与其要求 Javascript 代码处理 302,不如在 302 事件上返回带有自定义错误代码+消息的 500

【讨论】:

【参考方案5】:

我的问题原因是:

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

也许它可以帮助某人:)

【讨论】:

以上是关于在 JavaScript 中捕获 302 FOUND的主要内容,如果未能解决你的问题,请参考以下文章

javascript Issue302:20171018 - 动画商品トライアル

vuejs Newline required at end of file but not foun

javascript 使用AWS Lambda重定向到CloudFront上的尾部斜杠。 (所有这一切都因为S3使用302重定向而不是301)

DevTools failed to load source map: Could not load content for…System error: net::ERR_FILE_NOT_FOUN

DevTools failed to load source map: Could not load content for…System error: net::ERR_FILE_NOT_FOUN

springboot整合mybatis 异常 org.apache.ibatis.binding.BindingException: Invalid bound statement (not foun