gpt4 book ai didi

javascript - 在 Chrome 中发出同步可重定向 CORS 请求

转载 作者:行者123 更新时间:2023-11-28 04:23:50 25 4
gpt4 key购买 nike

考虑三个域:A、B 和 C。域 A 上的一段 JavaScript 代码对以下对象进行标准的同步 XMLHttpRequest GET 调用域 B,除了默认的 header 之外,仅具有 Accept header 。然后,域 B 重定向到域 C。两个响应​​(B 和 C)都将 Access-Control-Allow-Origin 设置为 *。这在 Firefox 中运行良好,据我所知,在 Internet Explorer 中也运行良好。然而,Chrome 似乎不允许这样做。不过,异步代码确实可以工作,在 Chrome 中也是如此。

直接向域 C(以及具有相同属性的假设域 D)发送同步和异步请求都可以工作

实际上对 AFAICT 没有帮助的相关内容

我在上面解释了一些简单的事情,以便让欺骗锤子使用者更容易阅读:

其他事情:

  • 该请求需要预检,但因其他原因失败。
    我的请求是 simple ,所以它不应该触发 CORS 预检。方法:GET; header :接受 没有指定 Content-Type 编辑:对于简单请求,Content-Type needs to be specified , 它似乎。我相应地修复了代码示例。
  • 代码无论如何都会触发 CORS 预检,因为 the Accept value is non-standard
    目前不适用于 Chrome。
  • Chrome 使同步使用变得更加困难。 XHR,如文档所述 here .
    不,这只是限制了我不使用的另一个功能。
  • 我不控制域 B 或 C
  • 需要从域 B 重定向到域 C

要测试的代码

以下代码发出一系列请求,首先同步到域 B(重定向到 C),然后异步,然后直接同步到域 C,异步到 C,并记录结果。请注意,日志可能不会按该顺序排列,因为这基本上是异步的要点。另请注意,在本例中,域 B 没有具有 Access-Control-Allow-Origin: *,但我已在具有 Access-Control-Allow-Origin: * 的域 B 上测试了此代码也是(本地主机,因此此处不可用)。

function request(url, callback) {
var synchronous = typeof callback !== 'function'
var xhr = new XMLHttpRequest()
if (!synchronous) {
xhr.onload = callback
}
xhr.open('GET', url, !synchronous)
xhr.setRequestHeader('Accept', 'application/vnd.citationstyles.csl+json')
xhr.setRequestHeader('Content-Type', 'text/plain')
xhr.send(null)
return xhr
}

var previewLength = 100

function handle(passed, message, data) {
var item = document.createElement('li')
item.innerText = message + (passed ? ' passed: ' : ' failed: ') + data
var list = passed ? p : f
list.appendChild(item)
}

var doi = '10.1093/BIOINFORMATICS/BTT178'
var domainB = 'doi.org'
var domainC = 'data.crossref.org'

var urlRedirect = '//' + domainB + '/' + doi
var urlDirect = '//' + domainC + '/' + doi

// sync domain B->C request
try {
var response = request(urlRedirect)
handle(true, 'sync domain B->C', response.responseText.slice(0, previewLength) + '...')
} catch (e) {
handle(false, 'sync domain B->C', e)
}

// async domain B->C request
request(urlRedirect, function() {
if (this.responseText[0] === '{') {
handle(true, 'async domain B->C', this.responseText.slice(0, previewLength) + '...')
} else {
handle(false, 'async domain B->C')
}
})

// sync domain C request
try {
var response = request(urlDirect)
handle(true, 'sync domain C', response.responseText.slice(0, previewLength) + '...')
} catch (e) {
handle(false, 'sync domain C', e)
}

// async domain C request
request(urlDirect, function() {
if (this.responseText[0] === '{') {
handle(true, 'async domain C', this.responseText.slice(0, previewLength) + '...')
} else {
handle(false, 'async domain C')
}
})
Passed:
<ul id=p></ul>Failed:
<ul id=f></ul>

我的问题

  • 是否有任何文档说明 Chrome 为何以及何时执行此操作?
  • 是否有解决方法(即同步重定向 CORS 请求)?我知道您无法在 XMLHttpRequest 中阻止重定向,但也许还有另一种方法。

我运行的是 Chromium 57.0.2987.98 32 位。

最佳答案

从 Chrome 69 及更高版本开始,它似乎按预期工作,但不确定如何以及为何。

关于javascript - 在 Chrome 中发出同步可重定向 CORS 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45238537/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com