网站首页 > 技术文章 正文
序言
测试给我提了个bug,说为什么一次操作,network里面两个请求。
我第一反应是。。。
走过去一瞧,原来是多了个options请求。
“这个你不用管,这个是浏览器默认发送的一个预检请求”。可是测试很执着:“这可肯定不行啊,明明是一次请求,为什么要两次呢?“。
“挺固执啊,那我就给你讲个明白”。
概述
当一个资源从与该资源本身所在的服务器不同的域、协议、端口请求一个资源时,资源会发起一个跨域 HTTP 请求。
出于安全原因,浏览器限制从脚本内发起的跨源HTTP请求,只能从加载应用程序的同一个域请求HTTP资源,除非使用CORS头文件。
对于浏览器限制这个词,要着重解释一下:不是浏览器限制了发起跨站请求,是跨站请求可以正常发起,但是返回结果被浏览器拦截了。
CORS概述
跨源资源共享标准新增了一组 HTTP 标头字段,允许服务器声明哪些源站通过浏览器有权限访问哪些资源。
另外,规范要求,对那些可能对服务器数据产生副作用的 HTTP 请求方法(特别是 GET 以外的 HTTP 请求,或者搭配某些 MIME 类型的 POST 请求),浏览器必须首先使用 OPTIONS 方法发起一个预检请求(preflight request),从而获知服务端是否允许该跨源请求。
服务器确认允许之后,才发起实际的 HTTP 请求。在预检请求的返回中,服务器端也可以通知客户端,是否需要携带身份凭证(例如 Cookie 和 HTTP 认证相关数据)。
简单请求
不会触发CORS预检的请求称为简单请求,满足以下所有条件的才会被视为简单请求。
- 使用GET、POST、HEAD其中一种方法
- 只使用了如下的安全首部字段,不得人为设置其他首部字段
- AcceptAccept-Language
- Content-Language
- Content-Type 仅限以下三种 text/plain、multipart/form-data、application/x-www-form-urlencoded
预检请求
需预检的请求要求必须首先使用 OPTIONS 方法发起一个预检请求到服务器,以获知服务器是否允许该实际请求。"预检请求“的使用,可以避免跨域请求对服务器的用户数据产生未预期的影响。
下面的请求会触发预检请求,其实非简单请求之外的就会触发预检,就不用记那么多了。
- 使用了PUT、DELETE、CONNECT、OPTIONS、TRACE、PATCH方法
- 人为设置了非规定内的其他首部字段,参考上面简单请求的安全字段集合,还要特别注意Content-Type的类型。
以下是一个发起预检请求的例子
发起请求的origin与请求的服务器的host不同,而且根据上面的条件判断,触发了预检
请求附带身份凭证 -> cookies
如果发起请求时设置withCredentials 标志设置为 true,从而向服务器发送cookie, 但是如果服务器端的响应中未携带Access-Control-Allow-Credentials: true,浏览器将不会把响应内容返回给请求的发送者。
对于附带身份凭证的请求,服务器不得设置 Access-Control-Allow-Origin 的值为*, 必须是某个具体的域名
注意,简单 GET 请求不会被预检;如果对此类带有身份凭证请求的响应中不包含该字段,这个响应将被忽略掉,并且浏览器也不会将相应内容返回给网页
完整请求流程
点关注,不迷路。
做干净纯粹的技术分享,有话评论区走起来。
- 上一篇: 如果用户觉得 web 应用反应卡顿, 主要从哪几个方面来排查?
- 下一篇: 前端报504错误如何定位
猜你喜欢
- 2025-01-02 前后端数据交互(六)——ajax 、fetch 和 axios 优缺点及比较
- 2025-01-02 前端报504错误如何定位
- 2025-01-02 如果用户觉得 web 应用反应卡顿, 主要从哪几个方面来排查?
- 2025-01-02 Vue短文:如何在HTTP请求时传递自定义头部
- 2025-01-02 前端小伙伴,axios 是如何封装 HTTP 请求的?(看完会了吗)
- 2025-01-02 SpringMVC实现原理之DispatcherServlet处理请求的过程
- 2025-01-02 Background Sync出世!前端离线请求火起来?
- 2025-01-02 最简单的 6 种防止数据重复提交的方法!(干货)
- 2025-01-02 跨站请求伪造(CSRF)攻击是什么?如何防御?
- 2025-01-02 大批量接口请求的前端优化
你 发表评论:
欢迎- 577℃几个Oracle空值处理函数 oracle处理null值的函数
- 573℃Oracle分析函数之Lag和Lead()使用
- 559℃Oracle数据库的单、多行函数 oracle执行多个sql语句
- 558℃0497-如何将Kerberos的CDH6.1从Oracle JDK 1.8迁移至OpenJDK 1.8
- 554℃Oracle 12c PDB迁移(一) oracle迁移到oceanbase
- 543℃【数据统计分析】详解Oracle分组函数之CUBE
- 531℃最佳实践 | 提效 47 倍,制造业生产 Oracle 迁移替换
- 527℃Oracle有哪些常见的函数? oracle中常用的函数
- 最近发表
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端react (48)
- 前端aes加密 (58)
- 前端脚手架 (56)
- 前端md5加密 (54)
- 前端路由 (61)
- 前端数组 (73)
- 前端js面试题 (50)
- 前端定时器 (59)
- 前端懒加载 (49)
- Oracle RAC (73)
- oracle恢复 (76)
- oracle 删除表 (48)
- oracle 用户名 (74)
- oracle 工具 (55)
- oracle 内存 (50)
- oracle 导出表 (57)
- oracle 中文 (51)
- oracle的函数 (57)
- 前端调试 (52)
- 前端登录页面 (48)
本文暂时没有评论,来添加一个吧(●'◡'●)