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

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

CrazyPanda发表于:2024-07-17 09:10:57浏览:286次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 请求中有自定义的标题头,那就不是简单请求了,所以,浏览器会先发送一次「预检请求」,「预检请求」通过后,再发送真正的请求。

猜你喜欢

【Swoole】Swoole常用配置设置
红色的标注表示比较重要的参数,可以影响到服务器的运行性能,务必注意1.worker_num描述:指定启动的worker进程数。 说明:swoole是master-> n * worker的模式,开启的worker进程数越多,server负载能力越大,但是相应的server占有的内存也会更多, 建议开启的worker进程数为cpu核数的1-4倍。 示例: 'worker_num' => 8  2. max_request  描述:每个worker进
发表于:2024-08-12 浏览:226 TAG: #php #thinkphp #swoole
【网络】七牛云存储创建空间并配置自定义域名
1. 创建空间bucket按规则填写名称,选择区域即可,至于共有还是私有,根据自己业务内容而定。空间创还能成功后会提示绑定自定义域名,点击立即绑定,或者在空间管理里面点击绑定域名。2. 添加域名在添加域名页面,填写自定义域名,系统会自动判断域名情况,如果未备案,默认只能选择海外,如果已备案,默认选择中国大陆。如果是未备案域名,对应的存储空间也只能选择海外空间,都由系统自动判定。这里只演示已备案域名,我的域名是在阿里云备案的。域名创建成功后,如下图,会显示CNAME未配置,复制CNAME对应的值,
发表于:2024-08-26 浏览:324 TAG: #七牛云 #云存储 #kodo
【网络】为什么有些POST请求会触发两次HTTP请求?
这个问题需要从浏览器的「同源策略」开始讲起。什么是同源策略呢?我的理解是,为了安全起见,浏览器只允许「同源」下的资源相互访问和共享,限制跨源请求。同源又是什么呢?所谓同源就是两个URL如果协议,主机(即IP),端口都相同,那么就称两个URL同源。协议:协议是定义了数据如何在计算机内和之间进行交换的规则的系统,例如 HTTP、HTTPS。主机:是已连接到一个计算机网络的一台电子计算机或其他设备。网络主机可以向网络上的用户或其他节点提供信息资源、服务和应用。使用 TCP/IP 协议族参与网络的计算机
发表于:2024-07-17 浏览:287 TAG:
【网络】聊聊从输入URL到页面展示这中间发生了什么
原文地址https://zhuanlan.zhihu.com/p/6003067781、解析URL:首先会对 URL 进行解析,分析所需要使用的传输协议和请求的资源的路径。如果输入的 URL 中的协议或者主机名不合法,将会把地址栏中输入的内容传递给搜索引擎。如果没有问题,浏览器会检查 URL 中是否出现了非法字符,如果存在非法字符,则对非法字符进行转义后再进行下一过程。2、缓存判断:浏览器会判断所请求的资源是否在缓存里,如果请求的资源在缓存里并且没有失效,那么就直接使用,否则向服务器发起新的请求
发表于:2024-06-19 浏览:237 TAG:
【Git】Git切换仓库链接提交代码
在Git中,当你想要切换到一个新的远程仓库链接并提交代码时,你可以按照以下步骤操作:
发表于:2025-02-11 浏览:69 TAG: #Git
【支付宝】支付宝服务商支付
通过第三方应用授权,服务商在取得商家授权后,可以代商家调用支付宝开放接口,以完成相应的业务逻辑(如代替商家发起当面付的收单请求等)。 授权采用标准的 OAuth2.0 流程,要进行第三方代调用,服务商需要在第三方应用中添加对应功能并获得商家授权,本文介绍服务商的第三方应用如何取得商家应用的授权。
发表于:2023-12-26 浏览:247 TAG: #支付宝
【网络】国内十大API数据服务平台
一、数据宝 https://www.chinadatapay.com/数据宝是国内领先的国有数据资产代运营服务商,数据丰富多元,覆盖人、企、车、路、能源、环境等数百个数据因子维度,专注于为国有数据资源方提供数据治理、产品研发、交易流通、应用变现等数据增值代运营服务,是国内少数同时具备了“国资参股、政府监管扶持、市场化运作、大数据资产交易合法经营资质”属性的大数据“国家队”。二、天眼数聚 https://www.tianyandata.cn/天眼数聚是一家专注于大数据服务的技术
发表于:2024-08-08 浏览:291 TAG: #api
【网络】开源协议有哪些,都有什么差异
在IT行业中,开源协议是用来定义如何使用、修改、分享和分发软件的法律条款。不同的开源协议在保留版权、允许的使用方式、对衍生作品的要求以及对分发的限制等方面有所不同。以下是一些常用的开源协议及其主要特点:1. MIT License (MIT)特点:非常宽松,基本上允许任何形式的使用、修改和再分发,只要保留版权声明。适用场景:适合那些希望自己的代码被广泛使用,且不想对使用者施加太多限制的项目。2. GNU General Public License (GPL)特点:要求任何发布/分发的衍生作品也
发表于:2024-08-01 浏览:264 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 浏览:310 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 浏览:261 TAG: #docker