防止重定向 Xmlhttprequest

IT技术 javascript ajax xmlhttprequest
2021-01-30 10:32:02

是否可以在发送 XMLHttpRequest-s 时阻止浏览器跟随重定向(即获取重定向状态代码并自己处理)?

6个回答

不符合XMLHttpRequest 对象的 W3C 标准(强调):

如果响应是 HTTP 重定向:

如果Location头所传达的URL来源与XMLHttpRequest来源同源,且重定向不违反死循环预防,则透明跟随重定向,同时遵守同源请求事件规则。

他们正在考虑将其用于未来版本:

本规范不包括正在考虑用于本规范未来版本的以下功能:

  • 禁用以下重定向的属性;

最新的规范不再提及这一点。

可笑的是,透明重定向涉及覆盖原始请求中设置的某些 HTTP 标头。具体来说,如果“接受”标头设置为特定的内容类型,则 Firefox 在跟随重定向时无法包含此标头(这使得开发使用此标头的完全基于 REST 的 Web 服务变得更加困难......叽)。
2021-03-13 10:32:02
更多的搜索给我带来了这个相当古老的错误报告:bugzilla.mozilla.org/show_bug.cgi?id=401564
2021-03-30 10:32:02
同意,完全rediculus设计缺陷。
2021-03-31 10:32:02

新的Fetch API支持不同的重定向处理模式:followerrormanual,但是我找不到在取消重定向时查看新 URL 或状态代码的方法。您可以停止重定向本身,然后它看起来像一个错误(空响应)。如果这就是您所需要的,那么您就可以开始了。你也应该知道,通过该API提出的请求是不可取消的还没有 他们现在。

对于 XMLHttpRequest,您可以HEAD检查服务器并检查 URL 是否已更改:

var http = new XMLHttpRequest();
http.open('HEAD', '/the/url');
http.onreadystatechange = function() {
    if (this.readyState === this.DONE) {
        console.log(this.responseURL);
    }
};
http.send();

您不会获得状态代码,但会找到新 URL,而无需从中下载整个页面。

有时使用OPTIONS可能是更好的选择,反正只适用于非通用目的等。管理员已配置重定向整个站点/模式,例如 HTTP -> HTTPS
2021-04-02 10:32:02

您可以使用responseURL属性来获取重定向目的地或检查响应是否最终从您接受的位置获取。
这当然意味着无论如何都会获取结果,但至少您可以获得有关重定向目的地的必要信息,例如在您想要丢弃响应时检测条件。

不,您在 XMLHttpRequest 公开的 API 中没有任何地方允许您覆盖其自动跟随 301 或 302 的默认行为。

如果客户端在 Windows 上运行 IE,那么您可以使用 WinHTTP 来设置一个选项来防止这种行为,但这是一个非常有限的解决方案。

正如其他评论中所回答的那样,无法在客户端处理重定向或 302 状态。但是,您可以阻止重定向。为此,您可以使用“XMLHttpRequest”设置请求头“X-Requested-With” xhttp.setRequestHeader("X-Requested-With", "XMLHttpRequest"); 这应该在打开之后但在发送之前完成。下面的例子

let xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function () {
   if (this.readyState == 4 && this.status == 200) {
         reqObj.success(JSON.parse(this.responseText))
   } else if (this.status != 200) {
         reqObj.error(this.statusText)
   }
};
xhttp.open(reqObj.type, reqObj.url, reqObj.async);
xhttp.setRequestHeader("X-Requested-With", "XMLHttpRequest");
xhttp.send();
这是唯一有效的解决方案!谢谢!
2021-03-24 10:32:02