阻止 Xmlhttprequest 的转向

在发送 XMLHttpRequest-s 时,是否有可能阻止浏览器遵循重定向(即获取重定向状态代码并自己处理它) ?

79366 次浏览

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

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

不是根据 XMLHttpRequest 对象的 W3C 标准(强调后加) :

如果响应是 HTTP 重定向:

如果由 Location 标头传递的 URL 的原点相同 与 XMLHttpRequest 源和 重定向并不违反无限 循环预防, 透明 在观察时遵循重定向 同源请求事件规则。

他们是 考虑到的未来版本:

本规范不包括 以下的特征是 考虑将来的版本 本规格:

  • 属性禁用以下重定向;

但是 最新的规范不再提到这一点。

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

新的 获取 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。

在客户端不可能处理重定向或302状态,正如在其他注释中所回答的那样。但是可以防止重定向。为此,您可以使用“ XMLHttpRequest”设置请求头“ X-Requsted-With” SetRequestHeader (“ X-Request-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();

我扩展了用户的应答,包括一个 abort()呼叫。当您需要的只是重定向 URL 时,这似乎可以防止服务器发送太多数据。

var url = 'the url'
var http = new XMLHttpRequest();
http.open('GET', url);
http.onreadystatechange = function() {
if (this.readyState === this.DONE) {
console.log(this.responseURL)
this.abort() // This seems to stop the response
}
}
http.send()

在现实生活中,我将上述代码包装在一个承诺中,但它使代码难以阅读。

此外,我不明白为什么获得重定向 URL 需要这么困难,但这是另一个时间和地点的问题。