Chrome 在 HTTP 302 重定向时取消 CORS XHR

2023-12-03

看起来像根据CORS 规范、GET 和 POST 请求应透明地遵循 302 重定向。但 Chrome 正在取消我的请求。

这是执行请求的 JS:

var r = new XMLHttpRequest();
r.open('GET', 'https://dev.mysite.com/rest', true);
r.send();

这是应该发生的事情:

  1. 客户端:XHR POST 请求到 /rest
  2. 服务器:响应 HTTP 302 重定向到 /rest/
  3. 客户:遵循该重定向

但在第 2 步之后,Chrome 取消了该请求。如果没有 HTTP 302,该请求将完美运行。我已经证实了这一点。

当请求运行时,我可以在 Chrome 的网络面板中看到只有一个 XHR——一个取消的 POST 请求,没有响应标头或响应正文。

使用Chrome的net-internals工具进行调试,我看到服务器发送了响应,之后请求被取消。这是请求的输出:

79295: URL_REQUEST
https://dev.mysite.com/rest
Start Time: 2013-08-30 12:41:11.637

t=1377880871637 [st=    0] +REQUEST_ALIVE  [dt=13455]
t=1377880871638 [st=    1]    URL_REQUEST_BLOCKED_ON_DELEGATE  [dt=1]
                              --> delegate = "extension Adblock Plus"
t=1377880871639 [st=    2]   +URL_REQUEST_START_JOB  [dt=13453]
                              --> load_flags = 143540480 (DO_NOT_SAVE_COOKIES | DO_NOT_SEND_AUTH_DATA | DO_NOT_SEND_COOKIES | ENABLE_LOAD_TIMING | MAYBE_USER_GESTURE | REPORT_RAW_HEADERS | VERIFY_EV_CERT)
                              --> method = "POST"
                              --> priority = 2
                              --> upload_id = "0"
                              --> url = "https://dev.mysite.com/rest"
t=1377880871639 [st=    2]      HTTP_CACHE_GET_BACKEND  [dt=0]
t=1377880871639 [st=    2]     +HTTP_STREAM_REQUEST  [dt=7]
t=1377880871646 [st=    9]        HTTP_STREAM_REQUEST_BOUND_TO_JOB
                                  --> source_dependency = 79296 (HTTP_STREAM_JOB)
t=1377880871646 [st=    9]     -HTTP_STREAM_REQUEST
t=1377880871646 [st=    9]     +HTTP_TRANSACTION_SEND_REQUEST  [dt=0]
t=1377880871646 [st=    9]        HTTP_TRANSACTION_SEND_REQUEST_HEADERS
                                  --> GET /facultyportfolio-rest HTTP/1.1
                                      Host: dev.liberty.edu
                                      Connection: keep-alive
                                      Content-Length: 46
                                      Origin: http://localhost:8080
                                      User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.62 Safari/537.36
                                      Content-Type: application/json; charset=UTF-8
                                      Accept: */*
                                      Referer: http://localhost:8080/ajaxtest.html
                                      Accept-Encoding: gzip,deflate,sdch
                                      Accept-Language: en-US,en;q=0.8
t=1377880871646 [st=    9]        HTTP_TRANSACTION_SEND_REQUEST_BODY
                                  --> did_merge = true
                                  --> is_chunked = false
                                  --> length = 46
t=1377880871646 [st=    9]     -HTTP_TRANSACTION_SEND_REQUEST
t=1377880871646 [st=    9]     +HTTP_TRANSACTION_READ_HEADERS  [dt=1001]
t=1377880871646 [st=    9]        HTTP_STREAM_PARSER_READ_HEADERS  [dt=1000]
t=1377880872646 [st= 1009]        HTTP_TRANSACTION_READ_RESPONSE_HEADERS
                                  --> HTTP/1.1 302 Found
                                      Date: Fri, 30 Aug 2013 16:41:11 GMT
                                      Server: Apache/2
                                      Access-Control-Allow-Origin: http://localhost:8080
                                      Access-Control-Allow-Credentials: true
                                      Location: https://dev.mysite.com/rest/
                                      Content-Language: en-US
                                      Vary: Accept-Encoding,User-Agent
                                      Content-Encoding: gzip
                                      Content-Length: 20
                                      Connection: close
                                      Content-Type: text/plain; charset=UTF-8
t=1377880872647 [st= 1010]     -HTTP_TRANSACTION_READ_HEADERS
t=1377880872647 [st= 1010]     +URL_REQUEST_BLOCKED_ON_DELEGATE  [dt=12445]
t=1377880885091 [st=13454]        CANCELLED
t=1377880885092 [st=13455]   -URL_REQUEST_START_JOB
                              --> net_error = -3 (ERR_ABORTED)
t=1377880885092 [st=13455] -REQUEST_ALIVE

最后,您可以看到“已取消”,因为“URL_REQUEST_BLOCKED_ON_DELEGATE”。我不知道这意味着什么。但同样,如果没有 HTTP 302 重定向,则不会发生错误。

有谁知道是什么原因导致 Chrome 取消此请求?


这里的答案是混合的,暗示了代码中的某些设置等,这可能会解决 CORS 的重定向问题,但 CORS 规范明确指定了此类 CORS 重定向何时会失败/通过: 根据规范,浏览器应该

  1. 如果对重定向资源的请求不需要飞行前检查(例如,没有自定义标头的简单 CORS 请求),则允许 3XX 重定向 。看https://www.w3.org/TR/cors/#simple-cross-origin-request-0

如果未设置手动重定向标志并且响应的 HTTP 状态代码为 301、302、303、307 或 308 应用重定向步骤

  1. 如果对重定向资源的请求需要飞行前检查,则不允许 3XX 重定向。看https://www.w3.org/TR/cors/#cross-origin-request-with-preflight-0

如果响应的 HTTP 状态代码为 301、302、303、307 或 308 应用缓存和网络错误步骤。

我在 github 存储库中探索了各种 CORS 场景:https://github.com/monmohan/cors-experiment.

重定向失败的特定问题也可以通过此处的捆绑包轻松地单独重现:https://github.com/monmohan/cors-experiment/tree/master/issue

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Chrome 在 HTTP 302 重定向时取消 CORS XHR 的相关文章

随机推荐

  • Angular:使用 Renderer2 添加 CSS 变量

    是否可以使用添加内联样式CSS变量Renderer2 我尝试了以下方法 但它不起作用 import Component OnChanges Output ViewChild Renderer2 ElementRef ViewEncapsul
  • Node CLI 工具评估字符串

    有没有办法使用 NodeJS CLI 工具来评估一串 Javascript 代码 例如 使用 Perl 将会是perl e code 使用Pythonpython c code 与红宝石ruby e code 并且使用 PHP php r
  • width:auto 对于 字段

    CSS新手问题 我想width auto for a display block元素的意思是 填充可用空间 然而对于一个
  • 从数据属性将字符串解析为对象[重复]

    这个问题在这里已经有答案了 我在使用 jQuery 验证插件时遇到了很多麻烦 解决这个问题的唯一方法是使用 submitHandler属性并在其中做一些技巧 其中检查触发器的父级是否是字段集以及是否有data submit handler属
  • Android布局文件夹可以包含子文件夹吗?

    现在 我将每个 XML 布局文件存储在 res layout 文件夹中 因此管理小型项目是可行且简单的 但是当存在大型且繁重的项目时 则应该有一个层次结构和布局文件夹内需要的子文件夹 for e g layout layout person
  • 意外的括号“[” - PHP [重复]

    这个问题在这里已经有答案了 我正在为我的小应用程序团队的 Java 代码编写一个小型存储库 但我的代码中到处都是这个错误 base explode class 0 仅此问题出现one每次都一行代码 据我所知 上面是正确的PHP语法 那么这是
  • 使用 SentiWordNet 获取不正确的分数

    我正在使用 SentiWordNet 进行一些情感分析 我参考了这里的帖子如何使用 SentiWordNet 然而 尽管尝试了各种输入 我还是得到了 0 0 分 我在这里做错了什么吗 谢谢 import java io BufferedRe
  • 使用 Boost 库的 CMake Windows 10 库未正确找到

    像许多其他人一样 我在 Windows 上使用 boost 库时遇到问题 在 Ubuntu 16 04 上 它与 libboost all dev 配合得很好 但在 Windows 上我遇到了很多问题 我尝试构建一个 cryptonote
  • 用于子集索引搜索的数据结构

    我正在研究一个时间 2019 03 17 标签 c jqueryimplementation我正在尝试找出一种有效的算法来在整个 DOM 的子集中定位元素 例如子选择器 目前 我正在构建 DOM 时创建常用选择器的索引 class id 和
  • emu8086 上的 Dos 指令 3Bh 更改工作目录

    我最近开始学习x8086指令 对指令的了解比较少 我试图使用 dos 函数 3Bh 更改当前工作目录 然后使用 39h 在该目录上创建一个名为 test2 的文件夹 不明白问题是什么 还是 emu8086 的问题 MODEL SMALL C
  • 通过公式更改单元格时的时间戳 (Excel)

    我需要一种方法来为相邻单元格添加时间戳 该单元格的值通过公式发生变化 使用this例如 我需要工作表 1 上与 A1 相邻的单元格来标记单元格值更改时的日期和时间 当单元格值通过公式更改时 我链接到上面的示例会启动一个消息框 当单元格值包含
  • CSS 边框向内弯曲

    I want to build the container with bended borders inside the element Is it possible to do using only css If it is contai
  • Angular 2 表单“找不到控件”

    我正在尝试使用 Angular 2 Forms 进行验证 但是当我尝试添加多个控件时 似乎它只是被忽略了 我遵循了许多不同的指南 看看其他人是如何做的 但这些方法似乎都不起作用 我一直在我的模板中做的是
  • 使用 QT 设计器创建的 PyQt5 程序从终端打开时不显示任何窗口

    我使用 QT Designer 没有任何问题 但今天我开始了一个新的 ubuntu 18 04 安装 但这一次当我从终端运行 PyQt5 程序时 它们没有显示任何窗口 从atom runner运行时也有同样的问题 它甚至没有显示任何窗口 错
  • 如何将用户信息从登录页面传递到主页?

    Error An object reference is required for the non static field method or property User Picture 如何将用户信息从登录页面传递到主页 线上错误Pic
  • 如何在 DataTables 中使用 pdfhtml5 导出 标签

    我想导出 a 使用 DataTables 中的单元格内的标签或链接pdfhtml5 截至目前 该链接显示为纯文本 如何打印它 包括其格式 这是一个两步过程 Step 1 使用数据表exportOptions format函数将完整的 HTM
  • IRC河豚加密模式?

    我一直在用这个工具做一些测试 http crypto hurlant com demo CryptoDemo swf并尝试匹配从 Mirc Blowfish 获得的 Blowfish 结果 来自以前的 Fish secure us v1 3
  • 在远程 Linux 机器上编译 C++ - “检测到时钟偏差”警告

    我通过 PuTTY 和 WinSCP 连接到我大学的小型 Linux 集群 使用后者传输文件并使用前者编译和运行它们 到目前为止 我的工作是在大学实验室进行的 但今天我在家里做了一些工作 产生了一个有趣的警告 我上传了整个文件夹的内容 然后
  • 通用方法返回类型 - 编译错误[重复]

    这个问题在这里已经有答案了 鉴于此代码示例 class A public class TestGenerics private static
  • Chrome 在 HTTP 302 重定向时取消 CORS XHR

    看起来像根据CORS 规范 GET 和 POST 请求应透明地遵循 302 重定向 但 Chrome 正在取消我的请求 这是执行请求的 JS var r new XMLHttpRequest r open GET https dev mys