跨域问题解决方案之CORS

跨域问题解决方案之CORS

文章目录

  • 跨域问题解决方案之CORS
    • 概述
    • 浏览器的同源策略
      • 同源的判定规则
      • 目的
      • 同源策略的限制范围
    • 浏览器的同源策略为什么会引发跨域问题?
    • CORS规则
    • CORS解决方案
      • CORS方案将请求分为两类
      • 举例
      • 简单请求
      • 预检请求
      • 总结
      • 学以致用

概述

  • 浏览器安全的基石是"同源政策"(same-origin policy)。
  • 1995年,同源政策由 Netscape 公司引入浏览器。目前,所有浏览器都实行这个政策。

浏览器的同源策略

同源的判定规则

  • 它的含义是指,A网页设置的 Cookie,B网页不能打开,除非这两个网页"同源"。所谓"同源"指的是"三个相同"。

    • 协议相同
    • 域名相同
    • 端口相同
  • 如果两个 URL 的 协议端口(如果有指定的话)和 域名 都相同的话,则这两个 URL 是同源的。

  • 下表给出了与 URL http://store.company.com/dir/page.html 的源进行对比的示例:

URL结果原因
http://store.company.com/dir2/other.html同源只有路径不同
http://store.company.com/dir/inner/another.html同源只有路径不同
https://store.company.com/secure.html失败协议不同
http://store.company.com:81/dir/etc.html失败端口不同(http:// 默认端口是 80)
http://news.company.com/dir/other.html失败主机不同

目的

  • 同源政策的目的,是为了保证用户信息的安全,防止恶意的网站窃取数据。
  • 设想这样一种情况:A网站是一家银行,用户登录以后,又去浏览其他网站。如果其他网站可以读取A网站的 Cookie,会发生什么?
  • 很显然,如果 Cookie 包含隐私(比如存款总额),这些信息就会泄漏。更可怕的是,Cookie 往往用来保存用户的登录状态,如果用户没有退出登录,其他网站就可以冒充用户,为所欲为。因为浏览器同时还规定,提交表单不受同源政策的限制。
  • 由此可见,"同源政策"是必需的,否则 Cookie 可以共享,互联网就毫无安全可言了。

同源策略的限制范围

  • 随着互联网的发展,"同源政策"越来越严格。目前,如果非同源,共有三种行为受到限制。
    • CookieLocalStorageIndexDB 无法读取。
    • DOM 无法获得。
    • AJAX 请求不能发送。

浏览器的同源策略为什么会引发跨域问题?

  • 请求发出 -> 响应 -> 浏览器会有个校验
  • 当浏览器校验通过的时候,就不会有跨域的问题
  • 当浏览器校验不通过的时候,就会引发跨域的问题
  • 这个校验的规则就叫做CORS规则
  • 所以,我们要做的就是让浏览器通过这个校验,也就没有跨域的问题了。而我们要让浏览器通过校验,就必须要了解CORS规则。

在这里插入图片描述

CORS规则

  • CORS全称:Cross-Origin Resource Sharing,中文翻译为:跨源资源共享 或 跨域资源共享。
  • CORS是一种基于 HTTP 头的机制,用于浏览器校验跨域请求。
  • 它的基本理念是:
    • 只要 服务器 明确表示 允许 ,则校验 通过
    • 服务器 明确 拒绝没有表示 ,则校验 不通过
  • 从原则中,我们可以看出,要用CORS来解决跨域问题,主要靠服务器来解决,也就是后端。
  • 使用CORS方案的前提,必需保证服务器是自己人。

CORS解决方案

  • 跨域的解决方案有很多,但是CORS是最正统的解决方案,也是官方推荐使用的方案。

CORS方案将请求分为两类

  • CORS方案将请求分为两类:
    • 简单请求(Simple requests),若请求满足所有下述条件,则该请求可视为简单请求:

      • 请求方法为之一:GETHEADPOST
      • 头部字段满足CORS安全规范,详见 W3C。简单来说只要我们不去改动请求的头部,就是满足安全规范的。
      • 请求头的Content-Type为下面三个中的一个:
        • text/plain
        • multipart/form-data
        • application/x-www-form-urlencoded
    • 预检请求(Preflight request / Preflighted requests)

      • 只要不是简单请求的都是预检请求
      • “需预检的请求”要求必须首先使用 OPTIONS 方法发起一个预检请求到服务器,以获知服务器是否允许该实际请求。

举例

  • 举例说明哪些是简单请求,哪些是预检请求

    // 简单请求: GET请求、没有改动请求头、没有改动Content-Type
    fetch('https://douyin.com');
    
    // 预检请求: 改动了请求头
    fetch('https://douyin.com', {
        headers: {
            a: 1,
        },
    });
    
    // 简单请求: POST请求、没有改动请求头、没有改动Content-Type
    fetch('https://douyin.com', {
        method: 'POST',
        body: JSON.stringify({a: 1, b: 2})
    });
    
    
    // 预检请求: 改动了Content-Type不满足第三个要求
    fetch('https://douyin.com', {
        method: 'POST',
        headers: {
            'content-type': 'application/json'
        }
        body: JSON.stringify({a: 1, b: 2})
    })
    

简单请求

在这里插入图片描述

  • 在发送请求的时候,浏览器发现跨域了,会自动带上一个请求头,这是自动的,我们不用管,我们也改不了,就是OriginOrigin表达的是当前的页面源,即从哪个源发送了这个跨域请求。
  • 此时服务器收到该请求发现http://my.com是自己人,此时服务器就要告诉浏览器你别管了这是自己人。服务器告诉浏览器这是自己人的方式有两种方案:
    • 第一种方案:设置一个响应头Access-Control-Allow-Origin并跟上这个源。只要这个源和当前的页面源保持一致,那么浏览器就知道服务器已经明确表示允许,则浏览器校验通过。
    • 第二种方案:设置响应头Access-Control-Allow-Origin*,这会告诉我浏览器:服务器对所有源都通过,那么浏览器也会校验通过。

预检请求

在这里插入图片描述

  • 当发送为非简单请求,即预检请求的时候,浏览器会引起高度重视。
    所以在第一步不会真实的发生这个请求,而是先发送一个询问给服务器(浏览器会先问一下服务器:哥们,我这边现在有个页面源在跨域请求你,我担心这个动作有危险,我先问一下你行不行,如果你告诉我行,我再发真实的请求给你)。
  • 所以,实际上第一步会发送一个预检请求向服务器进行询问,预检请求的请求方法为OPTIONS,然后会带上3个请求头参数
    • Origin:表达的是当前的页面源,即从哪个源发送了这个跨域请求。
    • Access-Control-Request-Method:用什么样的请求方法在请求。
    • Access-Control-Request-Headers:这次的请求改动了哪些请求头。
  • 当服务器收到OPTIONS的预检请求后,如果服务器说没问题,那么服务器会返回
    • Access-Control-Allow-Origin:服务器告诉浏览器我允许的源。
    • Access-Control-Allow-Methods:服务器告诉浏览器我允许的请求方法,可以是多个。
    • Access-Control-Allow-Headers:服务器告诉浏览器我允许的请求头是包含哪些的
    • Access-Control-Max-Age:服务器告诉浏览器只要是在86400秒内,只要是来自于Origin内的这个源的请求你都不要再重复的问我了,我都是这一套回答,你可以把它缓存起来。

在这里插入图片描述

  • 通过了预检请求之后,然后再进入第二部发送真实的请求,此时就和普通请求也就是简单请求是完全一样的了。

总结

  • CORS方案,服务器处理的逻辑就是按照浏览器的这套规范,对相应的头部做出设置即可。

学以致用

  • 领导让前端小王使用CORS在页面上自行解决跨域的问题。前端小王可以完成要求吗?
    • 不能。因为CORS是要动服务器的。
  • 前端小王在页面中想使用AJAX调用抖音的API接口,却发生了跨域的问题。小王想通过CORS来解决这个问题。前端小王可以解决吗?
    • 不能。必须要保证服务器是自己人。
  • 跨域上传图片没有问题,但是提交普通表单却遇到了跨域问题。前端小王仔细分析后,认为是服务器不支持预检请求导致的。前端小王分析的结果有可能发生吗?
    • 完全有可能。
      因为上传图片用的是POST请求方法,用的Content-Typemultipart/form-data,所以上传图片很有可能是一个简单请求。
      而提交普通表单可能是一个ajax,而通常在公司里,大部分使用json格式发过去的,这就要把Content-Type改成application/json,这样就变成了预检请求,那么预检请求遇到跨域问题就有可能是服务器支持简单请求,不支持预检请求导致的。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

文件操作详解(二)

目录 一.文件的顺序读写1.顺序读写函数(适合于所有的流)1.1 fgetc(读字符)1.2 fputc(写字符)1.3 fgets(读字符串)1.4 fput(写字符串)1.5 fscanf(格式化地读)1.6 fprintf(格式化地写) 2.顺序读写函数(只适用于文件流)2.1 fread(二进…

jupyter Notebook 默认路径修改

1. anaconda prompt 中运行 jupyter notebook --generate-config 命令,将在 C:\Users\Think\.jupyter文件下生成 jupyter_notebook_config.py 文件。 2.在jupyter_notebook_config.py 文件中,找c.NotebookApp.notebook_dir 这个变量, (1)若…

2012年认证杯SPSSPRO杯数学建模A题(第二阶段)蜘蛛网全过程文档及程序

2012年认证杯SPSSPRO杯数学建模 A题 蜘蛛网 原题再现: 第二阶段问题   现在我们假设一个具体的环境。假设有一个凸多边形的区域,蜘蛛准备在这个区域(或其一部分)上结一张网。   问题一: 在区域的边界上安置有若干…

区间概率预测python|QR-CNN-BiLSTM+KDE分位数-卷积-双向长短期记忆神经网络-时间序列区间概率预测+核密度估计

区间预测python|QR-CNN-BiLSTMKDE分位数-卷积-双向长短期记忆神经网络-核密度估计-回归时间序列区间预测 模型输出展示: (图中是只设置了20次迭代的预测结果,宽度较宽,可自行修改迭代参数,获取更窄的预测区间) 注&am…

【chrome扩展】简 Tab (SimpTab)‘每日一句名言’样式

背景:最初参考“每日诗词”发现总是那几句,可以更换API接口完成“每日一句名言” 声明:本人不会ajax及ccs样式,非专业人士,借助CHATGPT代码生成完成。请友善交流。 每一句名言API: "https://api.xygeng.cn/open…

焦糖布丁理论:从用户任务角度重新审视产品价值

一、引言: 在竞争激烈的市场环境中,我们经常会遇到这样的困惑:为什么一款自认为极具创新和品质的产品,却未能获得市场的青睐和认可?焦糖布丁理论为我们提供了一个全新的视角,即”客户并非在购买产品本身&a…

gitlab代码迁移,包含历史提交记录、标签、分支

1、克隆现有的GitLab仓库(http://localhost:8888/aa/bb/cc.git)到本地,包括所有分支和标签 git clone --bare http://localhost:8888/aa/bb/cc.git 2、在gitlab上创建一个空的仓库(http://localhost:7777/aa/bb/cc.git&#xff…

CAD Plant3D 2023 下载地址及安装教程

CAD Plant3D是一款专业的三维工厂设计软件,用于在工业设备和管道设计领域进行建模和绘图。它是Autodesk公司旗下的AutoCAD系列产品之一,专门针对工艺、石油、化工、电力等行业的设计和工程项目。 CAD Plant3D提供了一套丰富的工具和功能,帮助…

Spring Cloud微服务入门(一)

微服务的演变过程 //controller 视图交互层 前端数据处理传给service //1.DAO RequestBody userDAO String id;String type; {"id":"lcs", "type":"lcs"} //2.GET请求 findUserById?id1&typelcsRequestParam String …

电商大数据采集|电商API接口|自动化采集|人工采集

大数据采集是指从海量、异构、分散、动态的网络环境中收集、提取和存储数据的过程。大数据采集主要分为两种方式:自动化采集和人工采集。 1.自动化采集 电商API自动化采集是利用爬虫技术和API等方式,通过编写程序实现对网站或者应用程序中的数据进行自…

用户认证安全性测试

用户认证安全性测试 认证与会话管理认证--Authentication01 常见认证方式02 session认证Session Fixation攻击Session保持攻击 03 Token认证多因素认证session和token区别 04 暴力破解密码的那些事密码设置推荐策略 会话--Authorization 权限控制权限管理方式垂直权限管理水平权…

5.3.2 实验2:配置交换机端口安全

1、实验目的 通过本实验可以掌握: 交换机管理地址配置及接口配置。查看交换机的MAC地址表。配置静态端口安全、动态端口安全和粘滞端口安全的方法。 2、实验拓扑 配置交换机端口安全的实验拓扑如图所示。 配置交换机端口安全的实验拓扑 3、实验步骤 &#xff…

界面控件DevExtreme JS ASP.NET Core 2024年度产品规划预览(一)

在本文中我们将介绍今年即将发布的v24.1附带的主要特性,这些特性既适用于DevExtreme JavaScript (Angular、React、Vue、jQuery),也适用于基于DevExtreme的ASP.NET MVC/Core控件。 注意:本文中列出的功能和特性说明官方当前/预计的发展计划&a…

Jenkins--任务详解

一、任务类型 Jenkins的主要功能的实现是由执行任务去完成的,常用的任务类型主要有以下三种: 自由风格任务(Free Style Project): 这是Jenkins中最常用的任务类型,允许你自定义各种构建步骤和配置选项,如源码管理、构建触发器、…

【第十一届大唐杯全国大学生新一代信息通信技术大赛】赛题分析

赛道一 一等奖 7% 二等奖 15% 三等奖 25% 赛道二 参考文档: 《第十一届大唐杯全国大学生新一代信息通信技术大赛(产教融合5G创新应用设计)专项赛说明.pdf》 一等奖:7% 二等奖:10% 三等奖:20% 赛项一&am…

使用 Flume 将 CSV 数据导入 Kafka:实现实时数据流

使用 Flume 将 CSV 数据导入 Kafka:实现实时数据流 文介绍了如何使用 Apache Flume 将 CSV 格式的数据从本地文件系统导入到 Apache Kafka 中,以实现实时数据流处理。通过 Flume 的配置和操作步骤,我们可以轻松地将数据从 CSV 文件中读取并发…

Django複習總結

①Django是框架。那麼什麼是框架: 框架很像是一個骨架,帶有很多默認器官的骨架。我們可以根據需要改寫、複寫這些器官。 從而實現自己所需要的功能。 ②Django是MVC模型\MVT模型: MVC模型:M:models模型層 V&#…

wireshark解析grpc/protobuf的方法

1,wireshark需要安装3.20以上 下载地址:https://www.wireshark.org/ 2,如果版本不对,需要卸载,卸载方法: sudo rm -rf /Applications/Wireshark.app sudo rm -rf $HOME/.config/wireshark sudo rm -rf /…

【信号处理】基于变分自编码器(VAE)的脑电信号增强典型方法实现(tensorflow)

关于 在脑电信号分析处理任务中,数据不均衡是一个常见的问题。针对数据不均衡,传统方法有过采样和欠采样方法来应对,但是效果有限。本项目通过变分自编码器对脑电信号进行生成增强,提高增强样本的多样性,从而提高最终…

【Layui】------ layui实现table表格拖拽行、列位置的示例代码

一、完整的示例代码&#xff1a;&#xff08;请使用layui v2.8.3的版本&#xff09;看懂就能用、不要照搬、照搬会出错误、拷贝重要代码改改符合你自己的需求。 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><…