您的当前位置:首页>全部文章>文章详情

【网络】为什么有些POST请求会触发两次HTTP请求?

CrazyPanda发表于:2024-07-17 09:10:57浏览:294次TAG:

这个问题需要从浏览器的「同源策略」开始讲起。

什么是同源策略呢?

我的理解是,为了安全起见,浏览器只允许「同源」下的资源相互访问和共享,限制跨源请求。

同源又是什么呢?

所谓同源就是两个URL如果协议,主机(即IP),端口都相同,那么就称两个URL同源。

  • 协议:协议是定义了数据如何在计算机内和之间进行交换的规则的系统,例如 HTTP、HTTPS。

  • 主机:是已连接到一个计算机网络的一台电子计算机或其他设备。网络主机可以向网络上的用户或其他节点提供信息资源、服务和应用。使用 TCP/IP 协议族参与网络的计算机也可称为 IP 主机。

  • 端口:主机是计算机到计算机之间的通信,那么端口就是进程到进程之间的通信。

通过下表让我们来看看与 http://www.cab5.com:8090/user/address 同源的是哪些不同源的是哪些,如下:
1.png

默认情况下浏览器是不允许跨域访问的,只允许同源策略。

但是,我们在很多实际的场景下还是需要进行跨域访问。这里就不得不说 CORS 了。

CORS是什么?

CORS,全称 Cross-Origin Resource Sharing,中文翻译「跨源资源共享」。

TA 是一个机制,允许在受控的条件下,不同源的网页访问和共享资源。

TA 基本思想是,服务器在响应中增加一个标题头(HTTP头),用来指示哪些源可以访问资源。浏览器在发送真正的请求之前先发送一个「预检请求」(OPTIONS 请求)到服务器,「预检请求」会包含一些额外的头部信息,例如:Origin、Access-Control-Request-Method 等,用来告知服务器实际请求的方法和来源。服务器通过「预检请求」提供的信息判断是否允许实际的跨域请求,预检请求通过后,服务器会将允许的请求源、方法、标头等信息返回给浏览器。此时,浏览器才会发送真正的请求。

所有的 CORS 请求都会触发「预检请求」吗?

答案是否定的。那些不会触发 CORS 「预检请求」的请求,被称为「简单请求」,请求只要满足以下几个条件,就会被视为简单请求:

  1. HTTP 方法限制:只能使用 GET、HEAD、POST 这三种 HTTP 方法之一。如果请求使用了其他 HTTP 方法,就不再被视为简单请求。

  2. 自定义标头限制:请求的 HTTP 标头只能是以下几种常见的标头:Accept、Accept-Language、Content-Language、Last-Event-ID、Content-Type(仅限于 application/x-www-form-urlencoded、multipart/form-data、text/plain)。HTML 头部 header field 字段:DPR、Download、Save-Data、Viewport-Width、WIdth。如果请求使用了其他标头,同样不再被视为简单请求。

  3. 不使用自定义请求标头:请求不能包含用户自定义的标头。

  4. 请求中没有使用 ReadableStream 对象。

  5. 请求中的任意 XMLHttpRequestUpload 对象均没有注册任何事件监听器;XMLHttpRequestUpload 对象可以使用 XMLHttpRequest.upload 属性访问

回到我们标题中的那个问题:“为什么有些POST请求会触发两次HTTP请求?”

通过上边我们知道,POST 是一个简单的请求,按说浏览器不会发送一次「预检请求」的,但是,如果该 POST 请求中有自定义的标题头,那就不是简单请求了,所以,浏览器会先发送一次「预检请求」,「预检请求」通过后,再发送真正的请求。

猜你喜欢

【网络】开源协议有哪些,都有什么差异
在IT行业中,开源协议是用来定义如何使用、修改、分享和分发软件的法律条款。不同的开源协议在保留版权、允许的使用方式、对衍生作品的要求以及对分发的限制等方面有所不同。以下是一些常用的开源协议及其主要特点:1. MIT License (MIT)特点:非常宽松,基本上允许任何形式的使用、修改和再分发,只要保留版权声明。适用场景:适合那些希望自己的代码被广泛使用,且不想对使用者施加太多限制的项目。2. GNU General Public License (GPL)特点:要求任何发布/分发的衍生作品也
发表于:2024-08-01 浏览:273 TAG:
【系统】系统架构概述
什么是系统架构  系统架构 (System Architecture )是系统的一种整体的高层次的结构表示, 是系统的骨架和根基,也决定 了系统的健壮性和生命周期的长短。什么系统架构设计师  系统架构设计师在整个项目研制中的主导地位愈加重要。可以说,系统架构师就是项目的总设计师,他是一个既需要掌控整体又需要洞悉局部瓶颈,并依据具体的业务场景给出解决方案的总体设计人员;他要确认和评估系统需求,给出开发规范,搭建系统实现的核心构架,并澄清技术细节、扫清主要难点的技术人员;他要掌握技术团队的能力需要,
发表于:2024-06-20 浏览:265 TAG:
【网络】聊聊从输入URL到页面展示这中间发生了什么
原文地址https://zhuanlan.zhihu.com/p/6003067781、解析URL:首先会对 URL 进行解析,分析所需要使用的传输协议和请求的资源的路径。如果输入的 URL 中的协议或者主机名不合法,将会把地址栏中输入的内容传递给搜索引擎。如果没有问题,浏览器会检查 URL 中是否出现了非法字符,如果存在非法字符,则对非法字符进行转义后再进行下一过程。2、缓存判断:浏览器会判断所请求的资源是否在缓存里,如果请求的资源在缓存里并且没有失效,那么就直接使用,否则向服务器发起新的请求
发表于:2024-06-19 浏览:247 TAG:
【支付宝】支付宝服务商支付
通过第三方应用授权,服务商在取得商家授权后,可以代商家调用支付宝开放接口,以完成相应的业务逻辑(如代替商家发起当面付的收单请求等)。 授权采用标准的 OAuth2.0 流程,要进行第三方代调用,服务商需要在第三方应用中添加对应功能并获得商家授权,本文介绍服务商的第三方应用如何取得商家应用的授权。
发表于:2023-12-26 浏览:255 TAG: #支付宝
【行业动态】TIOBE4月榜单发布:C/C++深受内存安全影响、PHP辉煌不再!
4 月 TIOBE 编程语言榜单已发布,一起来看看本月有什么值得关注的新变化吧!01 C、C++ 深受“内存安全”的影响相较上个月,4 月 TIOBE 榜单的 Top 5 并没有太大变化,依旧是 Python、C、C++、Java、C#。不过,值得注意的是,Top 5 之列只有排名第一的 Python 是继续保持着正向增长的趋势,比上个月上涨了 0.78%,达到 16.41% 的市场份额。一直以来,Python 凭借简洁的语法和清晰的代码结构使得初学者能够快速上手,不仅在 Web 开发
发表于:2024-04-22 浏览:317 TAG:
【网络】为什么有些POST请求会触发两次HTTP请求?
这个问题需要从浏览器的「同源策略」开始讲起。什么是同源策略呢?我的理解是,为了安全起见,浏览器只允许「同源」下的资源相互访问和共享,限制跨源请求。同源又是什么呢?所谓同源就是两个URL如果协议,主机(即IP),端口都相同,那么就称两个URL同源。协议:协议是定义了数据如何在计算机内和之间进行交换的规则的系统,例如 HTTP、HTTPS。主机:是已连接到一个计算机网络的一台电子计算机或其他设备。网络主机可以向网络上的用户或其他节点提供信息资源、服务和应用。使用 TCP/IP 协议族参与网络的计算机
发表于:2024-07-17 浏览:295 TAG:
【测试】软件测试岗位常见的七中测试方法
软件测试是保证软件质量的一个非常重要的环节,而软件测试方法有很多种,测试人员要根据实际需求和目标选择合适的测试方法,才能提高软件测试的效率和准确性,确保软件质量和可靠性。下面将介绍软件测试常见的七种测试方法。黑盒测试黑盒测试又称功能测试,该测试方法验证被测对象使用质量及外部质量表现。采用黑盒测试方法,测试工程师将测试对象看作一个黑盒子,完全不考虑程序内部逻辑结构和内部特性,只依据需求规格说明书、设计文档及其他需求描述文档,检查被测对象是否与期望需求一致。白盒测试白盒测试,又称结构测试、逻辑驱动测
发表于:2024-06-22 浏览:272 TAG:
【其它】32位与64位系统之间有什么区别
首先,我们来解释一下32位和64位究竟意味着什么。这两种术语常用于描述计算机的操作系统架构。简而言之,32位系统表示其处理器一次能处理32位数据,而64位系统则意味着处理器每次能处理64位数据。这种差异带来了诸多方面的不同,包括系统性能、支持内存容量以及支持的软件类型等。接下来,我们将深入探讨这些差异。
发表于:2025-04-18 浏览:24 TAG: #操作系统
【Docker】docker --restart=unless-stopped 和 --restart=always 的区别
Docker 容器的 --restart 标志用于定义容器的重启策略。--restart=unless-stopped 和 --restart=always 这两个选项有一些细微但重要的区别:--restart=always:容器将始终尝试重启,无论它是如何停止的。如果容器崩溃,它会自动重启。如果Docker守护进程重启,容器也会自动启动。即使容器被手动停止(如使用 docker stop 命令),当Docker守护进程重启时,它也会重新启动。--restart=unless-stopped:容
发表于:2024-08-09 浏览:276 TAG: #docker
【网络】http面试题
一、http协议 HTTP协议是什么 HTTP(HyperText Transfer Protocol:超文本传输协议) 超文本可以说是“超级文本”或者说是“带超链接文本”。超链接文本可以有图片、动图、文字、视频。从本质上说它是一个内容文本,我们对网站的浏览,实际上是对内容的浏览。对于这些内容,都有统一的路径,我们称之为URL地址 http(s): //<主机>:<端口>/<路径> http:表示协议,有http和https协议 主机可以是ip也可以是域名,如
发表于:2024-07-17 浏览:220 TAG: