浏览器跨域问题

2023-10-27

1.同源策略

同源策略是一种约定,是浏览器最核心也是最基本的安全功能。可以说Web是构建在同源策略基础之上的,浏览器之上针对同源策略的一种实现。

同源:协议,域名,端口号都相同的才称为“同源”。

同源策略用于限制一个origin的文档或者它加载的脚本如何能与另一个源的资源进行交互,能帮助阻隔恶意文档,减少可能被攻击的媒介。是浏览器行为,保护本地数据不被JavaScript代码获取回来的数据污染,拦截的是客户端发出的请求回来的数据接收,即请求发送了,服务器响应了,但无法被浏览器接受。

同源策略限制的有:

1.无法读取非同源网站的Cookie、LocalStorage、IndexDB。

2.无法接触非同源网页的DOM。

3.无法想非同源地址发送AJAX请求。

2.跨域问题及解决

跨域问题

因为有同源策略的限制,会产生跨域问题,即指不同源的脚本在数据交互时,会报错。

解决途径有如下:

2.1JSONP

特点:请求方式只能是GET请求,简单。

思路:网页通过添加一个<script>元素,通过src属性向服务器发送query信息,query携带在客户端定义的函数。服务端在收到请求后,接受其函数,并在将数据作为其回调函数的参数,返回给客户端处理。

2.2CORS

跨资源共享W3C标准,需要浏览器和服务器同时支持。

在跨域中请求分为简单请求(普通HTML Form在不依赖脚本的情况下可以发出的请求)和非简单请求(需要先发起预检请求)。

为什么区分简单请求和非简单请求?

因为浏览器任务简单请求是安全的,所以可以通过跨域限制到达服务器,即无需对简单请求做预检请求。

对于非简单请求为什么要先发起一个预检请求给服务器?

跨域限制指对于请求来说,请求可以发出,但是请求响应回来的数据不被接收。但是请求已经发生,难免对服务器进行了数据操作。为避免这种情况,对于非简单请求需要首先发起预检请求,检测是否能发起真正的请求。(对于简单请求,浏览器认为其是安全的,无需发起预检请求)

预检请求的作用:询问服务器,当前网页所在的域名是否在服务器的许可名单中,以及可以使用哪些请求方法和头信息字段,获取到肯定的答复,浏览器才会发起正式的XMLHttpRequest请求,否则报错。

CORS过程

一、简单请求

浏览器直接发起CORS请求,就是在头信息中,增加一个Origin字段(说明本次请求来自哪个源)。

若指定域不在许可范围内,服务器返回一个正常的HTTP回应,不包含Access-Control-Allow-Origin字段,浏览器发现之后会抛出一个错误,被XMLHttpRequest的onerror回调函数捕获。其错误无法通过错误码识别,因为状态码可能是200。

若指定域在许可范围内,服务器返回的HTTP回应含以下头信息字段:

Access-Control-Allow-Origin:xxx 当字段值为*时,表示接受任何域名的请求。

Access-Control-Allow-Credentials:true/false 可选值,表示是否允许发送cookie。(默认情况下,cookie不包含在CORS请求中)为true,表示服务器允许cookie包含在CORS请求中。若服务器不需要cookie,删除该字段即可。

Access-Control-Expose-Headers:xxx 可选值,表示可以用getResponseHeader(‘字段名’)方法获取到的头信息字段。原XMLHttpRequest对象的getResponseHeader()方法只能拿到6个基本字段。

!注意:当CORS请求要携带cookie发送到服务器时,一方面需要服务器同意(Access-Control-Allow-Credentials:true);另一方面开发者需要在AJAX请求中设置withCredentials属性(xhr.withCredentials = true)否则就算服务器允许发送cookie,浏览器也不会处理。有些时候虽未设置withCredentials,但有些浏览器还是会一起发送cookie,这是可以设置withCredentials属性为false,显式关闭。

要发cookie,Access-Control-Allow-Origin不能设置为*,需指定明确的与请求网页一样的域名。

二、非简单请求

对服务器有特殊要求的请求,如请求方法是PUT/DELETE,或是Content-Type字段类型是application/json。

在正式请求前,会增加一次“预检”请求。浏览器先询问服务器,当前网页所在的域名是否在服务器的许可名单中,以及可以使用哪些请求方法和头信息字段。确定之后,当判断正确,才会根据返回的信息发送请求。

预检请求的请求方法是OPTIONS,会携带以下字段:

1.Origin:请求来自哪个域。

2.Access-Control-Request-Method:列出浏览器CORS请求会用到哪些HTTP请求。

3.Access-Control-Request-Headers:列出浏览器CORS请求会额外发送的头信息字段,有多个时,用逗号隔开。

服务器收到预检请求后,检查上诉上个字段,确认允许跨域请求,作出回应

若服务器否定了预检请求,会返回一个正常的HTTP响应(无任何与CORS相关的头信息字段),浏览器识别服务器不同意请求时,错误会被XMLHttpRequest的onerror回调函数捕获。

若服务器通过预检请求,会返回一个HTTP响应,包含如下字段:

1.Access-Control-Allow-Origin:允许的域

2.Access-Control-Request-Methods:返回服务器允许的所有请求方法,多个用逗号隔开

3.Access-Control-Request-Headers:返回服务器允许携带的所有头信息字段,多个用逗号隔开

4.Access-Control-Allow-Credentials:是否允许请求中携带cookie

5.Access-Control-Max-Age:可选值 表示本次预检的有效期 单位为秒 在此期间,无需重新发送方预检请求进行预检

整个CORS通信过程,都是浏览器自动完成,无需用户参与,浏览器一旦发现AJAX请求请求跨域,就会自动添加一些附加的头信息,有时还会多出一次附加的请求,但用户不会有感觉。

实现CORS通信的关键是服务器,只要服务器实现了CORS接口,就可以跨域通信

CORS允许浏览器向跨域服务器发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制

CORS跨域的特点:服务器代码需要添加一段解决跨域的代码,确保在特定源下的网页可以接受服务器请求的响应数据。

response.setHeader("Access-Control-Allow-Origin","*")

3.添加跨域访问的中间件

如gin框架,有开源的跨域访问中间件

在Express中,可以使用cors模块实现跨域访问

4.postMessage

HTML5引入的api,postMessage()允许来自不同源的脚本采用异步方式进行有效的通信,多用于窗口间数据通信。

eg.页面b通过iframe标签放入页面a,通过postMessage和onmessage实现相互通信

5.window.name

有三个html页面,a页面和b页面同域,c页面独立。第一步,a页面的iframe标签的src属性指向c页面地址。第二步,在a页面的iframe标签上定义一个onload方法,其作用是将src地址改为b页面地址。当a页面请求c页面时,c页面抛出一个window.name,这个方法在a页面访问b页面的时候仍然存在。

6.Hash

同window.name一样,a页面和b页面同域,c页面独立。a页面通过iframe标签的src属性带一个hash值传递给c页面,c页面获取其hash值,创建一个iframe标签,通过src将修改后的hash传给b页面,a页面可以通过监听b页面的hash变化获取c页面的hash值。

7.document.domain

利用document.domain指定域,但是需要一级域名一致才可以使用。

当需要在“www.sojson.com/shiro”中上传图片到“cdn.sojson.com/images/”中,需要在请求两个页面时,都加上document.domain = “sojson.com”。

8.WebScoket

WebSocket是HTML5中提出的持久化协议,是一种网络传输协议,位于OSI模型的应用层,可以在单个TCP连接上进行全双工通信,能够更好的节省服务器资源和带宽,并达到实时通讯

服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送消息,属于服务器推送技术的一种。

基于HTTP1.1协议完成1次握手,创建WebSocket连接。

在WebSocket之前,开发实时web应用的方式是轮询

轮询:在特定的时间间隔不断向服务器发送HTTP请求,问有无数据,有数据的话服务器就用响应报文回应,当轮询的频率比较高时,就可以近似实现“实时通信”的效果。

轮询的缺点:HTTP请求可能包含较长的头部,真正有效额数据只是很小的部分,会浪费很多带宽资源。

WebSocket协议的特点:

1.全双工。通信允许数据在两个方向上同时传输。自身就是全双工,不需要服务器推送。

2.二进制帧。采用二进制帧结构,语法和语义与HTTP协议完全不兼容,更侧重于“实时通信”。(HTTP协议更侧重传输效率)更好的处理二进制内容。

3.协议名。引入ws和wss代表明文和密文的WebSocket协议,默认端口使用80或443,几乎和HTTP协议一致。

4.较少的控制开销。数据包头部协议较小,不同于HTTP每次请求都需要携带完整的头部。

5.保持连接状态。创建连接后,成为一种由状态的协议,可以省略状态信息,不同于HTTP每次请求需要携带身份验证信息。

9.nginx后端配置

10.proxy反向代理

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

浏览器跨域问题 的相关文章

  • 如何给 unplugin-vue-components/vite 写一个简单的 resolver

    大部分工作 unplugin vue components 都已经处理好了 我们只需要接收组件名来判断是否是自己的组件 然后处理对应的导入逻辑 一共 3 个字段 as 重命名类似 import componentNameReName fro
  • ❤ Vue3 使用

    Vue3 使用 Vue3之toRefs的使用 作用 toRefs 可以将一个响应式的对象 转换成普通对象 但是转换后的普通对象的每一个属性值都是响应式的 这样我们可以使用es6的对象解构或者三点运算符等操作 代码
  • 掌握内网渗透之道,成为实战高手,看《内网渗透实战攻略》就够了

    文末送书 文末送书 今天推荐一本网络安全领域优质书籍 内网渗透实战攻略 文章目录 前言 如何阅读本书 目录 文末送书 前言 当今 网络系统面临着越来越严峻的安全挑战 在众多的安全挑战中 一种有组织 有特定目标 长时间持续的新型网络攻击日益猖
  • 接口测试之Fiddler弱网测试

    前言 目前市面上的APP功能越来越丰富 移动端测试也越显为重要 因为用户在网速慢的情况下 你的网站 软件 总能出现各种各样的问题 请不要忽略这一点 针对在不同的网络情况下 接下来 本篇要讲述的就是在通过fiddler对APP进行模拟弱网测试
  • 每天10个前端小知识 <Day 1>

    前端面试基础知识题 1 将数组的length设置为0 取第一个元素会返回什么 设置 length 0 会清空数组 所以会返回 undefined 2 e target 和 e currentTarget 有什么区别 e target 触发事
  • 【CTF必看】从零开始的CTF学习路线(超详细),让你从小白进阶成大神!

    最近很多朋友在后台私信我 问应该怎么入门CTF 个人认为入门CTF之前大家应该先了解到底 什么是CTF 而你 学CTF的目的又到底是什么 其次便是最好具备相应的编程能力 若是完全不具备这些能力极有可能直接被劝退 毕竟比赛的时候动不动写个脚本
  • 每天10个前端小知识 <Day 7>

    前端面试基础知识题 1 什么是尾调用优化和尾递归 尾调用的概念非常简单 一句话就能说清楚 就是指某个函数的最后一步是调用另一个函数 function f x return g x 上面代码中 函数f的最后一步是调用函数g 这就叫尾调用 尾调
  • 「网络安全渗透」如果你还不懂CSRF?这一篇让你彻底掌握

    1 什么是 CSRF 面试的时候的著名问题 谈一谈你对 CSRF 与 SSRF 区别的看法 这个问题 如果我们用非常通俗的语言讲的话 CSRF 更像是钓鱼的举动 是用户攻击用户的 而对于 SSRF 来说 是由服务器发出请求 用户 日 服务器
  • 通俗易懂,十分钟读懂DES,详解DES加密算法原理,DES攻击手段以及3DES原理

    文章目录 1 什么是DES 2 DES的基本概念 3 DES的加密流程 4 DES算法步骤详解 4 1 初始置换 Initial Permutation IP置换 4 2 加密轮次 4 3 F轮函数 4 3 1 拓展R到48位 4 3 2
  • 【gee】下载modis土地利用类型

    var china ee FeatureCollection projects assets china boundary var lc dataset ee ImageCollection MODIS 061 MCD12Q1 filter
  • Vue3 和Vue2的区别,以及钩子函数的使用

    Vue js 3 和 Vue js 2 是两个主要版本的流行前端框架 它们之间有很多区别 包括性能优化 新特性和改进的API等 以下是一些Vue 3与Vue 2之间的主要区别 以及一些示例代码来说明这些差异 1 性能优化 响应式系统 Vue
  • 低代码-详情页组件设计

    效果图 详情页数据结构定义 layout 按钮数据 buttonLayout headButton 页头按钮 footButton 页脚按钮 详情页表单配置 config 配置组件列表 detailLayout 默认行为 进表单初始化 只展
  • 低代码配置-属性配置面板设计

    模块设计 tab项切换 组件基础属性 组件数据属性 组件事件属性 表单属性 模块输出函数设计 tab切换函数 列表表单属性 数据来源 调用接口时一次赋予 无需使用selectItem 如需使用 归入基础属性 列表标题 是否展示筛选区域
  • 新手也能看懂的【前端自动化测试入门】!

    前言 最近在网上搜索前端自动化测试相关的文档 但是发现网上的文章都是偏使用 没有把一些基础概念说清楚 导致后续一口气遇到一些 karma Jasmine jest Mocha Chai BDD 等词汇的时候很容易一头雾水 这次一方面整理一下
  • JVM优化之 -Xss -Xms -Xmx -Xmn 参数设置

    JVM优化之 Xss Xms Xmx Xmn 参数设置 XmnXmsXmxXss有什么区别 Xmn Xms Xmx Xss都是JVM对内存的配置参数 我们可以根据不同需要区修改这些参数 以达到运行程序的最好效果 Xms 堆内存的初始大小 默
  • 30天精通Nodejs--第十九天:express-文件上传下载

    目录 前言 环境准备与依赖安装 文件上传功能实现 引入并配置express fileupload中间件 注意事项 文件下载功能实现 结语 前言 文件的上传和下载是许多应用程序必备的功能 Node js的Express框架同样可以通过集
  • 考虑光伏出力利用率的电动汽车充电站能量调度策略研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码 数据
  • 2023下半年软考「单独划线」合格标准公布

    中国计算机技术职业资格网发布了 关于2023年度下半年计算机软件资格考试单独划线地区合格标准的通告 2023下半年软考单独划线地区合格标准各科目均为42分 01 官方通告 关于2023年度下半年计算机软件资格考试单独划线地区合格标准的通告
  • 如何在 Python 脚本中使用 Google OAuth2

    在使用 Python 脚本将视频上传到 YouTube 频道时 若希望将视频上传到第二个频道 需要解决 OAuth2 授权的问题 解决方案 创建新的 Google Cloud 项目 from google oauth2 import ser
  • 网络安全行业热门认证证书合集

    网络安全认证证书 就和学历一样是敲门砖 拿到了可以用不到 但不能没有 技术大牛可以没有证书 但普通人不能没有 1 初级入门 就像学历在职场上展示一个人的基本素养一样 网络安全认证证书可以展示一个人在网络安全领域具备的基本知识和技能 它为初学

随机推荐

  • 解决 CommandNotFoundError: Your shell has not been properly configured to use ‘conda activate’问题

    针对使用conda进入虚拟环境时遇到的问题 CommandNotFoundError Your shell has not been properly configured to use conda activate 解决方法 win r
  • 解决Android中使用RecyclerView滑动时底部item显示不全的问题

    感觉这个bug是不是因人而异啊 找了很多文章都没能解决我的问题 包括在RecyclerView上在嵌套上一层RelativeLayout 添加属性android descendantFocusability blocksDescendant
  • 解决“L6200E Symbol xx defined (by xx.o and xx.o)”重复定义问题

    今天来分享一个关于自己之前遇到的一个问题 就是关于重复定义会造成的一个错误 错误提示为 OBJ LCD axf Error L6200E Symbol ascii 1206 multiply defined by lcd user o an
  • C语言每日一题:7.寻找数组中心下标。

    思路一 暴力求解 1 定义一个ps作为中间下标去记录下标值 2 循环下标ps从头到位 定义四个变量分别是left sum left right sum right 3 初始化left ps 1和right ps 1 当ps0 gt 就让su
  • etcd学习和实战:4、Java使用etcd实现服务发现和管理

    etcd学习和实战 4 Java使用etcd实现服务发现和管理 文章目录 etcd学习和实战 4 Java使用etcd实现服务发现和管理 1 前言 2 代码 2 1 服务注册 2 2 服务发现 2 3 运行结果 2 4 问题 3 最后 1
  • 关于SVM的一点笔记

    关于SVM的一点笔记 一 简单了解 1 感知机 perceptron 感知机是一种类似于生物中神经细胞功能的人工神经元 它可以把一个或者多个输入 x 1 x 1 x1 x
  • flask最基础的增删改查实现步骤及代码

    分类序列化器 写入要序列化的字段 user info id fields Integer name fields String 商品序列化器 写入要序列化的字段 goods info id fields Integer name field
  • Spring系列面试题(Spring、SpringMvc、SpringBoot)

    一 springboot自动配置原理 自动装配 简单来说就是自动把第三方组件的Bean装载到Spring IOC器里面 不需要开发人员再去写Bean的配置 在Spring Boot应用里面 只需要在启动类加上 SpringBootAppli
  • 五张图带你理解 RocketMQ 顺序消息实现机制

    大家好 我是君哥 今天聊一聊 RocketMQ 的顺序消息实现机制 在有些场景下 使用 MQ 需要保证消息的顺序性 比如在电商系统中 用户提交订单 支付订单 订单出库这 3 个消息应该保证顺序性 如下图 对于 RocketMQ 来说 主要是
  • Electron桌面开发入门

    1 初始化工作 midir electron demo cd electron demo npm init 到package json 文件下将入口文件修改为main js main main js 并且创建main js文件 electr
  • Java猫和狗(继承,多态,抽象,接口版)上

    Java的继承 抽象 多态 接口的简单应用 我们利用 猫和狗都是动物类 然后猫会抓鱼 狗会看门的这些方法来简单应用一下继承 抽象 多态 接口 简单思路就是 1 定义动物类 2 定义猫 狗类 让他们成为动物的子类 3 编写测试类 继承 使子类
  • PTA L1-016:查验身份证 (python)

    一 题目要求 二 参考代码 sheet 0 1 1 0 2 X 3 9 4 8 5 7 6 6 7 5 8 4 9 3 10 2 w 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 n int input c 0 f
  • ARM单片机FATFS文件系统的移植

    ARM单片机FATFS文件系统的移植 测试效果 前提条件 下载所需源码 FATFS 文件系统 SFUD万能驱动 加入工程 接口驱动 测试代码 FreeRTOS10 0 1 FATFS FF14A SFUD V1 1 0 STM32F103Z
  • 超过2t硬盘分区_大于2T的磁盘怎么分区呢?

    由于购买了磁盘柜专门用作存储 后来考虑到磁盘容量的动态管理 准备采用LVM进行动态扩容管理了 首先让前端挂载机器能够识别到磁盘柜的逻辑卷组 比如 dev sdb 先介绍2种分区表 MBR分区表 MBR含义 主引导记录 所支持的最大卷 2T
  • 6.8过程纹理

    过程纹理也称为自定义纹理 根据计算得出 这个例子使用了位置和原点的距离作为输入参数 并加入了动画 但是和目前的纹理没任何关系 纯手工计算 因为位置是三维的 所以在涉及到纹理的几个地方都要改为三维的 struct RENDEROBJECT D
  • Java中的&、&&、

    关于这几个的运算符我一代码的实例来介绍 如下 1 首先它们都是逻辑运算符 但是 和 是短路运算符 也就是只判断运算符左边的即可 就可以确定整个表达式的结果了 所以它的执行效率高于 和 因为这两个运算符需要将表达式中所有的boolean值都判
  • JAVA开发(行业现状与未来)

    JAVA开发行业经过了这么多年的发展 曾经从一个机顶盒程序起家 到超过3亿台以上设备都在运行JAVA程序 JAVA语言见证了整个互联网化的工业化过程 许许多多的东西从从传统模式搬到了线上 特别是电子商务和网络社交的发展 大量的资金投入的这个
  • 【算法系列篇】前缀和

    文章目录 前言 什么是前缀和算法 1 模板 前缀和 1 1 题目要求 1 2 做题思路 1 3 Java代码实现 2 模板 二维前缀和 2 1 题目要求 2 2 做题思路 2 3 Java代码实现 3 寻找数组的中心下标 3 1 题目要求
  • 【MATLAB第67期】# 源码分享

    MATLAB第67期 源码分享 基于MATLAB的morris全局敏感性分析 一 代码展示 clear all npoint 100 在分位数超空间中要采样的点数 计算次数iter npoint nfac 1 nfac 20 研究函数的不确
  • 浏览器跨域问题

    1 同源策略 同源策略是一种约定 是浏览器最核心也是最基本的安全功能 可以说Web是构建在同源策略基础之上的 浏览器之上针对同源策略的一种实现 同源 协议 域名 端口号都相同的才称为 同源 同源策略用于限制一个origin的文档或者它加载的