【问题标题】:Capture redirect location of javascript XMLHttpRequest捕获 javascript XMLHttpRequest 的重定向位置
【发布时间】:2011-05-26 19:38:18
【问题描述】:

我知道你不能在使用 XMLHttpRequest 时拦截或阻止重定向,因为浏览器会透明地跟随它,但是有可能

A.确定请求是否被重定向,或者

B.确定它重定向到的哪里? (假设响应没有给出任何提示)

示例代码:

$.post("/my-url-that-redirects/", {}, 
    function(response, statusCode, xmlHttpRequest){
        //Somehow grab the location it redirected to
    }
);

在我的例子中,firebug 将首先显示一个 POST 到 url,然后一个 GET 到重定向的 url。可以捕获该 GET 位置吗?

【问题讨论】:

  • 你只需要得到响应头中的内容。
  • xmlHttpRequest.getAllResponseHeaders() 似乎没有给出它所针对的 URL 的任何指示。
  • 有人在客户端找到任何解决方法吗?如果无法控制 Web 服务器,如何捕获重定向 URL。

标签: javascript jquery xmlhttprequest


【解决方案1】:

1) 使用不同于 301 (2**) 的状态码(如果通过 ajax 请求)并在客户端处理重定向:

var STATUS = {
  REDIRECT: 280
};

$.post('/redirected', {}, function(response, status, request) {
  if (status == STATUS.REDIRECT) {
    // you need to return the redirect url
    location.href = response.redirectUrl;
  } else {
    $('#content').html(request.responseText);
  }
});

2) 不要重定向:

我在“重定向模式”中使用它=在发布请求后重定向(您不想让用户刷新发布请求等)

对于 ajax 请求,这不是必需的,所以当发布请求是 ajax 时,我会改为转发(只是转发到不同的控制器 - 取决于您的服务器端框架,或者您正在使用什么......)。 POST 请求不会被浏览器缓存。

实际上,我不知道你需要它的原因是什么,所以这对你来说可能不是那么有用。这在服务器返回的 ajax 请求与普通请求不同的响应时很有帮助,因为当浏览器重定向 ajax 请求时,重定向的请求不是 XMLHttpRequest...

[更新]

您可以像这样访问(重定向请求的)标头:

$.post('redirected', {}, function(r, s, req) {
  req.getAllResponseHeaders();
  req.getResponseHeader('Location');
});

应该有'Location'标头,但这取决于服务器,哪些标头被发回...

【讨论】:

  • 不幸的是,这是一个模拟填写表格的帖子,而不是 ajax api,所以我无法控制从它发回的状态代码,或者它是否重定向.
  • 抱歉,我不确定我是否理解您的评论。你的意思是,服务器端不是由你自己管理的吗?所以,你不能改变服务器端?
【解决方案2】:

4 年后,现在可以在 Chrome 42+ (Opera 29+) 和 Firefox 39+ 中使用 XHR 实例中的 responseURL 找到最后一个重定向位置,但它在 IE、Edge 或 safari 中尚不可用。

【讨论】:

  • 我认为只有在正确设置 CORS 的情况下才可能成立。
猜你喜欢
  • 2018-09-11
  • 1970-01-01
  • 2011-12-09
  • 2020-03-23
  • 1970-01-01
  • 2014-04-18
  • 1970-01-01
  • 1970-01-01
  • 2016-06-16
相关资源
最近更新 更多