防止重定向Xmlhttprequest

时间:2008-10-23 01:40:20

标签: javascript ajax xmlhttprequest

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

5 个答案:

答案 0 :(得分:94)

不符合the W3C standard for the XMLHttpRequest object(强调补充):

  

如果响应是HTTP重定向:

     
    

如果Location头传送的URL的来源是相同的来源     使用XMLHttpRequest源和     重定向不会违反无限     循环预防措施,透明     观察时遵循重定向     同源请求事件规则。

  

它们是considering以供将来发布:

  

此规范不包括   以下是正在进行的功能   考虑将来的版本   这个规范:

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

latest规范不再提及此问题。

答案 1 :(得分:30)

新的Fetch API支持不同的重定向处理模式:followerrormanual,但我找不到查看新方法的方法取消重定向时的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();