【问题标题】:Ajax request with CORS redirect fails in IE11带有 CORS 重定向的 Ajax 请求在 IE11 中失败
【发布时间】:2016-07-26 16:55:35
【问题描述】:

我正在尝试向同一域上的资源发出 ajax 请求。在某些情况下,请求被重定向(303)到外部资源。外部资源支持 CORS。

在 Chrome、Firefox 或 Safari 等浏览器中,请求成功。
在 IE11 中,请求失败并出现错误:

SCRIPT 7002: XMLHttpRequest: Network Error 0x4c7, The operation was canceled by the user

ajax 请求是用 jQuery 发出的:

$.ajax({
  url: "/data",
  type: "POST",
  dataType: "json",
  contentType: "application/json;charset=UTF-8",
  data: JSON.stringify({name: 'John Doe'})
}).done(function () {
  console.log('succeeded');
}).fail(function () {
  console.log('failed');
});

我构建了一个小example 来演示这个问题。你可以看到代码here

无重定向

带重定向

有没有办法解决这个问题?我错过了什么?

【问题讨论】:

  • 我也遇到过同样的问题 - 关于这个问题的一些更新?
  • 这是一个非常具体的问题,特别符合我所看到的场景。有没有人对这种特殊情况有任何想法
  • @NickHarrison 看看我下面的回复,我认为它可能对您有所帮助:stackoverflow.com/a/43410576/7199519

标签: ajax redirect cors


【解决方案1】:

在 CORS 标准的初始定义中,不允许在成功的 CORS 预检请求后进行重定向。

IE11 实现了这个(现已过时的)标准。

自 2016 年 8 月以来,这种情况发生了变化,现在所有主流浏览器都支持它(这里是实际的 pull request)。

恐怕要支持

第 1 部分)服务器端(我在这里使用 node.js express):

function _isIE (request) {
  let userAgent = request.headers['user-agent']
  return userAgent.indexOf("MSIE ") > 0 || userAgent.indexOf("Trident/") > 0
}

router.post('data', function (request, response) {
  if (_isIE(request)) {
    // perform action
    res.set('Content-Type', 'text/plain')
    return res.status(200).send(`${redirectionTarget}`)
  } else {
    // perform action
    response.redirect(redirectionTarget)
  }
})

第 2 部分客户端

注意:这是纯 Javascript,但您可以轻松地将其调整为您的 jQuery/ajax 实现。

var isInternetExplorer = (function () {
  var ua = window.navigator.userAgent
  return ua.indexOf("MSIE ") > 0 || ua.indexOf("Trident/") > 0
})()

function requestResource (link, successFn, forcedRedirect) {
  var http
  if (window.XMLHttpRequest) {
    http = new XMLHttpRequest()
  } else if (window.XDomainRequest) {
    http = new XDomainRequest()
  } else {
    http = new ActiveXObject("Microsoft.XMLHTTP")
  }
  http.onreadystatechange = function () {
    var OK = 200
    if (http.readyState === XMLHttpRequest.DONE) {
      if (http.status === OK && successFn)  {
        if (isInternetExplorer && !forcedRedirect) {
          return requestResource(http.responseText, successFn, true)
        } else {
          successFn(http.responseText)
        }
      }
    }
  }
  http.onerror = http.ontimeout = function () {
    console.error('An error occured requesting '+link+' (code: '+http.status+'): '+http.responseText)
  }
  http.open('GET', link)
  http.send(null)
}

【讨论】:

  • 我们已经为此实施了解决方法。你的建议似乎也很好。谢谢你的解释!
【解决方案2】:

【讨论】:

  • 抱歉,这个具体问题在哪里得到解答?您提供的链接是关于如何在 IE 中发出 cors 请求以及 IE 通常如何处理 cors。这没有帮助。
猜你喜欢
  • 2017-02-14
  • 2016-01-07
  • 2015-11-26
  • 2013-12-06
  • 2014-08-22
  • 2014-10-19
  • 2021-11-19
  • 1970-01-01
  • 2016-09-25
相关资源
最近更新 更多