是否可以在发送 XMLHttpRequest-s 时阻止浏览器跟随重定向(即获取重定向状态代码并自己处理)?
防止重定向 Xmlhttprequest
不符合XMLHttpRequest 对象的 W3C 标准(强调):
如果响应是 HTTP 重定向:
如果Location头所传达的URL来源与XMLHttpRequest来源同源,且重定向不违反死循环预防,则透明跟随重定向,同时遵守同源请求事件规则。
他们正在考虑将其用于未来版本:
本规范不包括正在考虑用于本规范未来版本的以下功能:
- 禁用以下重定向的属性;
但最新的规范不再提及这一点。
新的Fetch API支持不同的重定向处理模式:follow
、error
和manual
,但是我找不到在取消重定向时查看新 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,而无需从中下载整个页面。
您可以使用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();