是否可以阻止浏览器在发送XMLHttpRequest-s时遵循重定向(即重新获取重定向状态代码并自行处理)?
答案 0 :(得分:94)
不符合the W3C standard for the XMLHttpRequest object(强调补充):
如果响应是HTTP重定向:
如果Location头传送的URL的来源是相同的来源 使用XMLHttpRequest源和 重定向不会违反无限 循环预防措施,透明 观察时遵循重定向 同源请求事件规则。
它们是considering以供将来发布:
此规范不包括 以下是正在进行的功能 考虑将来的版本 这个规范:
- 要禁用以下重定向的属性;
但latest规范不再提及此问题。
答案 1 :(得分:30)
新的Fetch API支持不同的重定向处理模式:follow
,error
和manual
,但我找不到查看新方法的方法取消重定向时的URL或状态代码。你可以自己停止重定向,然后它看起来像一个错误(空响应)。如果这就是您所需要的,那么您很高兴。 此外,您应该知道通过此API发出的请求无法取消yet。 他们现在are。
对于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();
您无法获取状态代码,但会在不从中下载整个网页的情况下找到新网址。
答案 2 :(得分:12)
您可以使用responseURL
属性获取重定向目标,或检查响应是否最终从您接受的位置获取。
这当然意味着无论如何都会获取结果,但至少可以获得有关重定向目的地的必要信息,例如,当您想要放弃响应时检测条件。
答案 3 :(得分:11)
不,您在XMLHttpRequest公开的API中没有任何地方允许您覆盖其自动跟随301或302的默认行为。
如果客户端在Windows上运行IE,那么您可以使用WinHTTP来设置一个选项以防止该行为,但这是一个非常有限的解决方案。
答案 4 :(得分:0)
无法像其他评论中回答的那样在客户端处理重定向或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();