在发送 XMLHttpRequest-s 时,是否有可能阻止浏览器遵循重定向(即获取重定向状态代码并自己处理它) ?
不,在 XMLHttpRequest 公开的 API 中没有任何地方允许您自动覆盖它的默认行为,即遵循301或302。
如果客户端在 windows 上运行 IE,那么你可以使用 WinHTTP 来设置一个选项来防止这种行为,但这是一个非常有限的解决方案。
不是根据 XMLHttpRequest 对象的 W3C 标准(强调后加) :
如果响应是 HTTP 重定向: 如果由 Location 标头传递的 URL 的原点相同 与 XMLHttpRequest 源和 重定向并不违反无限 循环预防, 透明 在观察时遵循重定向 同源请求事件规则。
如果响应是 HTTP 重定向:
如果由 Location 标头传递的 URL 的原点相同 与 XMLHttpRequest 源和 重定向并不违反无限 循环预防, 透明 在观察时遵循重定向 同源请求事件规则。
他们是 考虑到的未来版本:
本规范不包括 以下的特征是 考虑将来的版本 本规格: 属性禁用以下重定向;
本规范不包括 以下的特征是 考虑将来的版本 本规格:
但是 最新的规范不再提到这一点。
您可以使用 responseURL属性获取重定向目标,或者检查响应是否最终从您接受的位置获取。 这当然意味着无论如何都会获取结果,但是至少您可以获得关于重定向目标的必要信息,例如,当您想要放弃响应时,可以检测条件。
responseURL
新的 获取 API支持不同的重定向处理模式: follow、 error和 manual,但是当重定向被取消时,我找不到查看新 URL 或状态代码的方法。您只需要停止重定向本身,然后它看起来就像一个错误(空响应)。如果这就是你需要的,你可以走了。还应该注意,通过这个 API 发出的请求是不可取消的。 他们现在是。
follow
error
manual
至于 XMLHttpRequest,您可以 HEAD服务器并检查 URL 是否已经更改:
HEAD
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 时,这似乎可以防止服务器发送太多数据。
abort()
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 需要这么困难,但这是另一个时间和地点的问题。