什么是 HTTP 请求中的 preflight 类型请求

news2024/11/25 6:28:35

在浏览器的 HTTP 请求中,当我们使用 fetch API 或者 XMLHttpRequest 来进行跨域请求时,浏览器有时会发送一种称为 Preflight 的请求。这种请求是浏览器在实际发送跨域请求前,先与目标服务器进行的一次 “探测” 请求,以确认服务器是否允许这样的请求方式。Preflight 请求的存在是为了保障浏览器的安全性,确保跨域请求不会在没有服务器允许的情况下进行。

跨域资源共享(CORS)机制规定了当浏览器发起跨域请求时,某些条件下需要发送 Preflight 请求。这种探测性的请求使用 OPTIONS 方法发出,目标是向服务器询问,客户端接下来想要发送的实际请求是否被允许。
下面是一个例子:

Preflight 请求的触发条件

不是所有的跨域请求都会触发 Preflight 请求,浏览器会根据请求的类型和头部信息来决定是否需要预检。Preflight 请求通常在以下几种情况下触发:

  1. 当请求方法不是 GETPOSTHEAD,例如 PUTDELETE
  2. 当请求包含非标准的 HTTP 头部字段,比如自定义的 Authorization 头部,或者 Content-Type 不是 application/x-www-form-urlencodedmultipart/form-datatext/plain

下面是自定义头部字段触发 preflight 请求的一个例子:

  1. 请求中涉及跨域资源时,尤其是涉及到敏感的操作时,浏览器会通过 Preflight 请求来确保服务器允许这些操作。

这种设计的初衷是为了防止跨域请求滥用,尤其是在涉及敏感数据的场景下,确保浏览器与服务器之间的交互安全。

Preflight 请求的流程

当浏览器决定某个跨域请求需要进行 Preflight,它会先向目标服务器发出一个 OPTIONS 请求,携带一些必要的头部信息,如 Access-Control-Request-MethodAccess-Control-Request-Headers,用于告知服务器,客户端即将发送的请求的具体方法和头部信息。服务器通过响应来告知浏览器,是否允许这样的请求。

请求示例:

假设我们要向 https://api.example.com/data 发送一个跨域的 PUT 请求,并且需要携带自定义头部 X-Custom-Header。在实际发出 PUT 请求之前,浏览器会自动生成如下的 Preflight 请求:

OPTIONS /data HTTP/1.1
Host: api.example.com
Origin: https://client.example.com
Access-Control-Request-Method: PUT
Access-Control-Request-Headers: X-Custom-Header

其中,Access-Control-Request-Method 头部用来告诉服务器接下来会使用 PUT 方法,而 Access-Control-Request-Headers 则表明请求中会携带 X-Custom-Header 这个自定义头部。

服务器响应:

服务器接收到 Preflight 请求后,必须返回一个响应来告诉浏览器是否允许此类请求:

HTTP/1.1 204 No Content
Access-Control-Allow-Origin: https://client.example.com
Access-Control-Allow-Methods: GET, PUT, POST, DELETE
Access-Control-Allow-Headers: X-Custom-Header

服务器通过 Access-Control-Allow-Origin 来指定哪些源是允许访问的(这里是 https://client.example.com),通过 Access-Control-Allow-Methods 来列出允许的 HTTP 方法,并通过 Access-Control-Allow-Headers 来列出允许的头部字段。
下面是 Preflight 请求来自服务器端的响应的一个例子:

Preflight 请求的使用场合

Preflight 请求主要用于跨域场景下,特别是那些涉及到更复杂请求的场合,比如非 GETPOST 方法,或者请求中包含了额外的自定义头部。

常见的使用场景包括:

  1. RESTful API 请求:当前端应用需要与其他域名下的 REST API 进行交互时,尤其是对资源进行 PUTDELETE 操作时,往往会触发 Preflight 请求。这些操作可能会修改服务器上的数据,因此需要确保安全。

    例如,一个前端应用需要向远程服务器发送数据更新请求,使用 PUT 方法更新用户信息。在这种场景下,Preflight 请求就会确保目标服务器允许跨域的 PUT 请求。

  2. 上传文件的操作:在表单上传文件时,如果使用 fetch API 或 XMLHttpRequest 并携带了非标准的头部,比如自定义的认证信息,通常会触发 Preflight 请求。浏览器需要确保服务器允许上传操作以及这些自定义的头部字段。

  3. 自定义认证头部的请求:很多应用在发起跨域请求时,需要在头部中携带如 AuthorizationToken 的自定义认证信息。由于这些头部字段并非标准字段,浏览器会先发送 Preflight 请求来探测服务器是否允许使用这些自定义头部。

Preflight 请求的实际案例

在实际开发中,有一个典型的例子是前端应用需要向第三方服务发送请求并带有认证信息。这种场景下的跨域请求常常会触发 Preflight 请求。

假设我们开发了一个电子商务应用,这个应用的后端服务托管在 https://api.shop.com,而前端页面托管在 https://shop.com。用户在购物时,前端需要向后端发送带有用户身份认证的请求,如以下场景:

  1. 用户在购物车页面点击结账,前端应用需要向后端 API 发送包含用户认证信息的请求,以确认用户是否已登录,且是否有购买权限。
  2. 请求方法为 POST,同时头部中带有 Authorization: Bearer token123 来验证用户身份。

此时,由于 Authorization 头部是非标准字段,且前端和后端的域名不同,这个请求会触发 Preflight 检查。

请求步骤:
  1. Preflight 请求
    浏览器会自动先发送一个 OPTIONS 请求,探测服务器是否允许发送带有 Authorization 头部的跨域请求:

    OPTIONS /checkout HTTP/1.1
    Host: api.shop.com
    Origin: https://shop.com
    Access-Control-Request-Method: POST
    Access-Control-Request-Headers: Authorization
    
  2. 服务器响应
    后端服务器接收到该请求后,会检查是否允许该跨域请求,并返回允许的结果:

    HTTP/1.1 204 No Content
    Access-Control-Allow-Origin: https://shop.com
    Access-Control-Allow-Methods: POST
    Access-Control-Allow-Headers: Authorization
    

    响应中,服务器明确告知浏览器允许该域名 https://shop.com 发起 POST 请求,并且允许使用 Authorization 头部。

  3. 实际请求
    在确认服务器允许跨域请求后,浏览器会继续发送实际的 POST 请求,包括认证信息:

    POST /checkout HTTP/1.1
    Host: api.shop.com
    Origin: https://shop.com
    Authorization: Bearer token123
    
使用 Preflight 请求的优化

尽管 Preflight 请求保障了安全性,但在一些频繁的跨域请求场景下,这会带来额外的网络开销。为此,可以采用一些优化策略:

  1. 服务器缓存 Preflight 响应:通过在响应中设置 Access-Control-Max-Age 头部,服务器可以告知浏览器在一定时间内不需要重复进行 Preflight 请求。这能显著减少不必要的 OPTIONS 请求,提升应用的性能。

    例如,服务器可以返回这样的响应,告知浏览器在未来 10 分钟内不需要重新发起 Preflight 请求:

    HTTP/1.1 204 No Content
    Access-Control-Allow-Origin: https://shop.com
    Access-Control-Allow-Methods: POST
    Access-Control-Allow-Headers: Authorization
    Access-Control-Max-Age: 600
    
  2. 减少复杂的请求:避免不必要的自定义头部字段,或者尽量使用简单的 GETPOST 请求,能够有效减少 Preflight 请求的触发。对于一些轻量级的操作,使用标准的请求方法和头部可以避免 Preflight 请求,从而提升效率。

结语

Preflight 请求作为 CORS 机制的一部分,主要作用是确保跨域请求的安全性,尤其是在涉及非标准请求时。通过 Preflight 请求,浏览器与服务器能够就请求的合法性达成共识,保护用户的数据安全。在实际应用中,理解 Preflight 请求的工作原理,并在合适的场景下进行优化,能够大大提升 Web 应用的性能和用户体验。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2190703.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java基础_异常总结详解

1 列举一些列举常见的运行时异常 运行时异常都是 RuntimeException 子类异常 NullPointerException - 空指针异常 ClassCastException - 类转换异常 IndexOutOfBoundsException - 下标越界异常 ArithmeticException - 计算异常 IllegalArgumentException - 非法参数异常 Numb…

C - Separated Lunch

题目链接: C - Separated Lunch (atcoder.jp) 题目描述: 大致意思是:有n个人,让你把他们分为两个组,然后分完后的这两个组的最大值最小为多少? 数据范围: 样例输入: 5 2 3 5 10 12 样例输出:…

二分查找算法——在排序数组中查找元素的第一个和最后一个位置

1.题目解析 题目来源:在排序数组中查找元素的第一个和最后一个位置——力扣 测试用例 2.算法原理 查找左端点 此时根据二段性,需要将数组分为大于target与小于target两部分,然后取出中点位置判断此时中点位置的值与target的大小关系&#xf…

SpringBoot校园资料分享平台:设计与实现

3系统分析 3.1可行性分析 通过对本校园资料分享平台实行的目的初步调查和分析,提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本校园资料分享平台采用JAVA作为开发语言,Sprin…

基于Springboot+Vue的计算中心共享平台(含源码数据库)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 系统中…

vSAN02:容错、存储策略、文件服务、快照与备份、iSCSI

目录 vSAN容错条带化存储策略1. 创建新策略2. 应用存储策略 vSAN文件服务文件服务快照与备份 vSAN iSCSI目标服务 vSAN容错 FTT:Fault to Tolerance 允许故障数 故障域:每一台vSAN主机是一个故障域 - 假设3台超融合(3计算1存储)&…

2024年最新版本神马TV8.5影视APP源码 293TV影视点播系统源码搭建教程 神马TV8.2加强版反编译教程 保姆级小白可搭建 完整版本视频教程

2024年最新版的神马TV影视APP源码,版本号8.5,提供了前所未有的定制化选项和高级功能。用户可以轻松更换应用的包名和名称,确保品牌个性化。此外,该应用采用了动态域名加密技术,增强了数据传输的安全性。它支持自动切换…

【可视化大屏】将柱状图引入到html页面中

到这里还是用的死数据&#xff0c;先将柱状图引入html页面测试一下 根据上一步echarts的使用步骤&#xff0c;引入echarts.js后需要初始化一个实例对象&#xff0c;所以新建一个index.js文件来进行创建实例化对象和配置数据信息等。 //在index.html引入<script src"j…

Redis:zset类型

Redis&#xff1a;zset类型 zset命令ZADDZCARDZCOUNTZRANGEZREVRANGEZRANGEBYSCOREZREVRANGEBYSCOREZPOPMAXBZPOPMAXZPOPMINBZPOPMINZRANKZREVRANKZSCOREZREMZREMRANGEBYRANKZREMRANGEBYSCOREZINCRBY 集合间操作ZINRERSTOREZUNIONSTORE 内部编码ziplistskiplist 在Redis中&…

文心一言 VS 讯飞星火 VS chatgpt (362)-- 算法导论24.3 4题

四、Gaedel 教授写了一个程序&#xff0c;他声称该程序实现了 Dijkstra 算法。对于每个结点 v ∈ V v∈V v∈V,该程序生成值 u . d u.d u.d 和 v . π v.π v.π 。请给出一个时间复杂度为 O ( V E ) O(VE) O(VE) 的算法来检查教授所编写程序的输出。该算法应该判断每个结…

安卓AI女友项目之安卓AI虚拟数字人整合开发

第9章 安卓AI虚拟数字人整合开发 在人工智能技术的推动下&#xff0c;创建具有交互能力的虚拟数字人已成为现实。本章将指导你如何在安卓平台上整合开发一个AI虚拟数字人应用&#xff0c;包括文字与语音的切换、按住说话输入、与ChatGPT进行文字及语音对话、滑动选择不同虚拟人…

算法篇1:双指针思想的运用(1)--C++

一.算法解析 双指针&#xff0c;顾名思义就是两个指针&#xff0c;常见的算法中&#xff0c;我们可以看到两种&#xff1a; 1.对撞指针&#xff1a;一般用于顺序结构&#xff0c;也称为左右指针。 对撞指针从两端向中间移动。一个指针从最左端开始&#xff0c;另一个从最右端…

Tkinter打包成EXE安装文件

打包成 .exe可执行文件 1. 安装PyInstaller&#xff0c;命令如下&#xff1a; pip install pyinstaller2. 编写你的Tkinter应用程序&#xff1a; 创建一个Python文件&#xff0c;例如app.py&#xff0c;并写入你的Tkinter代码。 3. 在 app.py 文件所在的目录使用PyInstaller…

系统架构设计师⑤:系统性能

系统架构设计师⑤&#xff1a;系统性能 系统的性能指标主要分为2个方面&#xff1a;硬件和软件。 性能指标计算 关键词描述&#xff1a; ①平均每条指令的平均时钟周期个数(CPl&#xff0c;clockperinstruction) ②每(时钟)周期运行指令条数(IPC&#xff0c;instructionper…

OpenCV透视变换

#透视变换 import cv2 import numpy as np import matplotlib.pyplot as pltimg cv2.imread(coins.jpg,1)imgInfo img.shape height imgInfo[0] width imgInfo[1] #src 4->dst 4 (左上角 左下角 右上角 右下角) matSrc np.float32([[200,100],[200,400],[600,100],[wid…

数据驱动投资:AI在股票市场的应用

当ChatGPT首次亮相时&#xff0c;其卓越的语言处理能力立刻引起了许多行业的广泛关注&#xff0c;投资界也不例外。关于ChatGPT是否能应用于投资决策的问题&#xff0c;迅速成为热门讨论的焦点。 近期&#xff0c;加拿大多伦多大学和印度孟买理工学院的研究人员联合开展了一项…

Mysql:数据库和表增删查改基本语句

一、数据库操作 1&#xff09;、数据库创建 创建数据库本质就是创建一个目录&#xff08;ubuntu&#xff0c;创建的目录文件存放在/var/lib/mysql&#xff09;&#xff1b;后续创建表本质就是在该目录下创建文件&#xff08;不同存储引擎&#xff0c;会创建的文件数目是不同的…

Linux进程概念2

前言 1. Linux真实的调度算法 首先cpu中有一个叫做runqueue的东西&#xff0c;这个东西就是去弄进程的调度的&#xff0c;里面有很多东西&#xff0c;这里我们就写这些了 其中task_struct*这个数组指向的是140个元素&#xff0c;其中0~99就是系统默认的进程&#xff0c;后面的…

ARM assembly: lesson 11

在之前&#xff0c;我们提到&#xff0c;当函数的参数小于等于4个时&#xff0c;我们会把它存放于寄存器中&#xff0c;但是如果函数参数大于4个&#xff0c;我们就需要通过stack去进行参数的存储,这毫无疑问&#xff0c;将增加代码操作的复杂性&#xff0c;因为我们需要对于栈…

国外透明代理IP解析:匿名性的全貌

网络世界中&#xff0c;透明代理IP是一个广受关注的话题。究竟什么国外透明代理IP&#xff1f;以及它的匿名性如何&#xff1f;本文将深入解析透明代理IP的定义及其匿名性&#xff0c;为您呈现一个清晰的认识。 1. 概念 透明代理IP是指在进行网络请求时&#xff0c;客户端&am…