什么是 HTTP Get + Preflight 请求
当在 Chrome 开发者工具的 Network 面板中看到 GET + Preflight
的 HTTP 请求方法时,意味着该请求涉及跨域资源共享 (CORS),并且该请求被预检了。理解这种请求的背景,主要在于 CORS 的工作机制和现代浏览器对安全性的管理。
下面是在 Chrome 开发者工具 Network 面板里观察到的例子:
什么是 CORS?
CORS 是 Cross-Origin Resource Sharing
的缩写,它是浏览器与服务器之间的一种安全机制,用于控制不同源(如不同域名、端口或协议)之间的 HTTP 请求。正常情况下,浏览器会禁止不同源之间的请求(称为同源策略)。然而,CORS 是一种打破同源策略的方式,允许服务器明确声明哪些源可以访问它的资源。
什么是 Preflight?
Preflight
是 CORS 机制中的一个关键概念。它是一个通过 OPTIONS
方法发出的请求,目的是在执行实际的跨域请求之前,浏览器询问服务器是否允许这个跨域操作。这种请求被称为“预检”请求。浏览器会发起 Preflight
请求,以确保实际的 GET
、POST
等请求可以被安全执行。
预检请求主要是为了处理那些对服务器有潜在影响的“复杂”请求,例如:
- 使用
PUT
、DELETE
方法。 - 使用自定义的 HTTP 头。
下面是自定义 HTTP 请求头部的一个例子:
- 发送 JSON 格式的数据。
通过预检,服务器可以回应是否允许该请求,并指定具体的允许条件,比如允许哪些 HTTP 方法、请求头或返回数据。
为什么会看到 GET + Preflight
?
当你看到 GET + Preflight
,意味着浏览器在发起跨域的 GET
请求时,进行了一个预检请求,以确保服务器允许这个请求。预检请求用 OPTIONS
方法发送,服务器在响应时会指明是否允许后续的跨域请求。
举个例子,假设你有一个前端应用运行在 http://example.com
,而它想要获取一个来自 http://api.example.com
的资源。如果浏览器认为这个请求是一个复杂请求,它就会先发起一个 OPTIONS
请求(即预检),并等待服务器确认是否允许该请求。
示例
场景描述
设想一个跨域 API 请求,前端应用试图从远程 API 获取数据:
fetch('https://api.example.com/data', {method: 'GET',headers: {'X-Custom-Header': 'CustomValue'}
});
在这个例子中,由于使用了自定义头 X-Custom-Header
,浏览器会认为这个请求是复杂的,因此需要执行 Preflight
。
预检请求
在这种情况下,浏览器会首先发送一个 OPTIONS
请求去探测目标服务器是否允许该请求。这是典型的预检请求:
OPTIONS /data HTTP/1.1
Host: api.example.com
Origin: http://example.com
Access-Control-Request-Method: GET
Access-Control-Request-Headers: X-Custom-Header
服务器响应可能看起来像这样:
HTTP/1.1 200 OK
Access-Control-Allow-Origin: http://example.com
Access-Control-Allow-Methods: GET, POST
Access-Control-Allow-Headers: X-Custom-Header
这意味着服务器允许来自 http://example.com
的跨域请求,支持 GET
方法,并且允许使用 X-Custom-Header
请求头。预检请求成功后,浏览器才会继续发送实际的 GET
请求。
一个实际的例子:
实际的 GET
请求
预检成功后,浏览器会发送最终的 GET
请求:
GET /data HTTP/1.1
Host: api.example.com
Origin: http://example.com
X-Custom-Header: CustomValue
服务器响应:
HTTP/1.1 200 OK
Content-Type: application/json
Access-Control-Allow-Origin: http://example.com
{"data": "example data"
}
在 Chrome 的 Network 面板中,你会看到这两个请求,分别是 OPTIONS
和 GET
。由于 Preflight
是 GET
请求的一部分,所以你看到的请求被标记为 GET + Preflight
。
使用场合
GET + Preflight
这种情况经常发生在需要跨域请求并且请求较为复杂的场景中。比如:
- 前端应用与不同源的后端 API 通信。
- 微服务架构中,前端可能需要从不同的微服务中获取数据。
- 某些情况下,安全性考虑使得跨域资源访问变得更加严格,比如访问需要认证的资源。
假如没有 Preflight
机制,浏览器的同源策略会限制开发者对外部资源的访问,造成跨域请求无法正常进行。而 Preflight
提供了一个安全的方式,确保跨域请求在得到服务器许可的情况下才会被执行。
如何优化 Preflight 请求?
虽然 Preflight
提供了安全性保障,但额外的 OPTIONS
请求会增加请求的开销,尤其是在高频 API 请求的场景下。开发者可以通过以下方式优化:
-
减少复杂请求:避免使用自定义的请求头,或者在不必要的情况下使用复杂的 HTTP 方法。比如,简单的
GET
或POST
请求,不使用复杂的头部时,是不需要Preflight
请求的。 -
服务器端优化:通过设置
Access-Control-Max-Age
头,允许浏览器缓存Preflight
的结果。例如:Access-Control-Max-Age: 600
这表示浏览器可以在 600 秒内不必再次进行预检,从而减少了
Preflight
请求的频率。 -
同源策略优化:在架构设计中,尽量避免跨域请求,尤其是在应用内部组件之间通信时。比如,使用反向代理让所有服务运行在同一域下,避免触发 CORS 机制。
总结
GET + Preflight
请求是现代 Web 应用中非常常见的一部分,它代表了浏览器对跨域请求的安全管理。通过理解 CORS 及其预检机制,开发者可以更好地设计跨域 API 请求,优化应用的性能,同时确保安全性。
在复杂 Web 应用中,特别是 SPA(单页应用)和基于 API 的架构中,跨域请求频繁发生。Preflight
请求的存在可以确保这些跨域操作在安全的前提下进行,同时让开发者能够更灵活地设计前后端分离的架构。
相关文章:

什么是 HTTP Get + Preflight 请求
当在 Chrome 开发者工具的 Network 面板中看到 GET Preflight 的 HTTP 请求方法时,意味着该请求涉及跨域资源共享 (CORS),并且该请求被预检了。理解这种请求的背景,主要在于 CORS 的工作机制和现代浏览器对安全性的管理。 下面是在 Chrome …...

(JAVA)开始熟悉 “二叉树” 的数据结构
1. 二叉树入门 符号表的增删查改操作,随着元素个数N的增多,其耗时也是线性增多的。时间复杂度都是O(n),为了提高运算效率,下面将学习 树 这种数据结构 1.1 树的基本定义 树是我们计算机中非常重要的一种数据结构…...

【Linux】Linux命令与操作详解(一)文件管理(文件命令)、用户与用户组管理(创建、删除用户/组)
文章目录 一、前言1.1、Linux的文件结构是一颗从 根目录/ 开始的一个多叉树。1.2、绝对路径与相对路径1.3、命令的本质是可执行文件。1.4、家目录 二、文件管理2.1、文件操作1、pwd2、ls3、cd4、touch5、mkdir6、cp7、rm8、mv9、rmdir 2.2、查看文件1、cat2、more3、less4、hea…...

Hadoop大数据入门——Hive-SQL语法大全
Hive SQL 语法大全 基于语法描述说明 CREATE DATABASE [IF NOT EXISTS] db_name [LOCATION] path; SELECT expr, ... FROM tbl ORDER BY col_name [ASC | DESC] (A | B | C)如上语法,在语法描述中出现: [],表示可选,如上[LOCATI…...
个人开发主页
网站 GitHubCSDN知乎豆包Google百度 多媒体 ffmpeg媒矿工厂videolanAPPLE开发者官网华为开发者官网livevideostack高清产业联盟github-xhunmon/VABloggithub-0voice/audio_video_streamingdoom9streamingmediaFourCC-wiki17哥Depth.Love BlogOTTFFmpeg原理介绍wowzavicuesof…...

思维+数论,CF 922C - Cave Painting
目录 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 二、解题报告 1、思路分析 2、复杂度 3、代码详解 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 922C - Cave Painting 二、解题报告 1、思路分析 诈骗题 我们发现 n mo…...

如何下单PCB板和STM贴片服务- 嘉立创EDA
1 PCB 下单 1.1 PCB 设计好,需要进行DRC 检查。 1.2 生成gerber文件、坐标文件和BOM文件 1.3 打开嘉立创下单助手 上传gerber文件 1.4 选择下单数量 1.5 选择板材, 一般常用板材 PR4 板材。 1.6 如果需要阻抗匹配,需要选择设计的时候阻抗叠…...

MySQL连接查询:外连接
先看我的表结构 dept表 emp表 外连接分为 1.左外连接 2.右外连接 1.左外连接 基本语法 select 字段列表 FORM 表1 LEFT [OUTER] JOIN 表2 ON 条件;例子:查询emp表的所有数据,和对应部门的员工信息(左外连接) select e.*, d.n…...

108页PPT丨OGSM战略规划框架:实现企业目标的系统化方法论
OGSM战略规划框架是一种实现企业目标的系统化方法论,它通过将组织的目标(Objectives)、目标(Goals)、策略(Strategies)和衡量指标(Measures)进行系统化整合,确…...

文件查找与打包压缩,文件发送
grep:文件内容过滤 [roothostname ~]# grep root /etc/passwd从/etc/passwd文件中过滤root字段 root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin [roothostname ~]# grep nologin$ /etc/passwd //$以..结尾 ^以..开头 b…...

sv标准研读第十二章-过程性编程语句
书接上回: sv标准研读第一章-综述 sv标准研读第二章-标准引用 sv标准研读第三章-设计和验证的building block sv标准研读第四章-时间调度机制 sv标准研读第五章-词法 sv标准研读第六章-数据类型 sv标准研读第七章-聚合数据类型 sv标准研读第八章-class sv标…...

MySQL-联合查询
1.简介 1.1为什么要使用联合查询 在数据设计时由于范式的要求,数据被拆分到多个表中,那么要查询⼀个条数据的完整信息,就 要从多个表中获取数据,如下图所⽰:要获取学⽣的基本信息和班级信息就要从学⽣表和班级表中获…...

突触可塑性与STDP:神经网络中的自我调整机制
突触可塑性与STDP:神经网络中的自我调整机制 在神经网络的学习过程中,突触可塑性(Synaptic Plasticity)是指神经元之间的连接强度(突触权重)随着时间的推移而动态变化的能力。这种调整机制使神经网络能够通…...

【小沐学GIS】QGIS导出OpenStreetMap数据(QuickOSM、OSM)
文章目录 1、简介1.1 OSM1.2 QuickOSM1.3 Overpass Turbo 2、插件安装3、插件使用3.1 快速查询(boundary边界)3.2 快速查询(railway铁路)3.3 快速查询(boundaryadmin_level行政边界)3.4 快速查询࿰…...

推荐一款强大的书签管理工具,让你的网址不在落灰
在信息爆炸的互联网时代,我们每天都会浏览大量的网页,收藏各种各样的网址。然而,随着时间的推移,这些杂乱无章的书签往往让我们感到头疼。别担心,今天我要向你推荐一款强大的书签管理工具,它将帮助你轻松整…...

Python 工具库每日推荐 【Matplotlib】
文章目录 引言Python数据可视化库的重要性今日推荐:Matplotlib工具库主要功能:使用场景:安装与配置快速上手示例代码代码解释实际应用案例案例:数据分析可视化案例分析高级特性自定义样式动画效果3D绘图性能优化技巧扩展阅读与资源优缺点分析优点:缺点:总结【 已更新完 T…...
在远程非桌面版Ubuntu中使用Qt5构建Hello World项目
在 Linux 下运行 Qt 应用程序,需要完成以下几个步骤,包括安装 Qt 工具、设置开发环境以及编译和运行项目。下面是详细的步骤: 1. 安装 Qt 1.1使用系统包管理器 sudo apt update 和 sudo apt install qt5-default qtcreator 命令用于更新 U…...

netty之基础aio,bio,nio
前言 在Java中,提供了一些关于使用IO的API,可以供开发者来读写外部数据和文件,我们称这些API为Java IO。IO是Java中比较重要知识点,且比较难学习的知识点。并且随着Java的发展为提供更好的数据传输性能,目前有三种IO共…...

在找工作吗?给你一个AI虚拟面试官助力你提前准备面试
大家好,我是Shelly,一个专注于输出AI工具和科技前沿内容的AI应用教练,体验过300款以上的AI应用工具。关注科技及大模型领域对社会的影响10年。关注我一起驾驭AI工具,拥抱AI时代的到来。 让AI点亮我们的生活,是Shelly对…...
@KafkaListener注解中containerFactory属性的作用
在使用Spring Kafka时,containerFactory 属性是 KafkaListener 注解中的一个选项,它允许你指定一个 ContainerFactory Bean 的名称。这个 ContainerFactory 负责创建和管理 Kafka 消息监听容器。 以下是 containerFactory 属性的一些关键作用࿱…...

XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...

自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
C++.OpenGL (14/64)多光源(Multiple Lights)
多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...

基于SpringBoot在线拍卖系统的设计和实现
摘 要 随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统,主要的模块包括管理员;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...

C# 表达式和运算符(求值顺序)
求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如,已知表达式3*52,依照子表达式的求值顺序,有两种可能的结果,如图9-3所示。 如果乘法先执行,结果是17。如果5…...
Bean 作用域有哪些?如何答出技术深度?
导语: Spring 面试绕不开 Bean 的作用域问题,这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开,结合典型面试题及实战场景,帮你厘清重点,打破模板式回答,…...

给网站添加live2d看板娘
给网站添加live2d看板娘 参考文献: stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下,文章也主…...