前端网络之【浏览器跨域问题分析与解决方案】
文章目录
- 同源策略
- 同源与异源
- 跨域的限制场景
- 解决方案
-
- CORS
-
- 请求分类
-
- 简单请求
- 预检请求
- 注意点一 【关于Cookie】
- 注意点二 【关于跨域获取响应头】
- JSONP
-
- 基本流程
- 代理服务器
- 如何选择对应方案
同源策略
**
同源策略
是一套浏览器的安全策略机制
,当一个源
的文档和脚本,与另一个源
的资源进行通信时,同源策略
就会对这个通信做出不同程度的限制
。简单来说,同源策略
就是对同源资源的访问请求放行
,对异源资源的访问请求限制
,因此限制造成的开发问题,称之为跨域(异源)
问题。点击查看W3C官方文档对同源策略的解释描述**
同源与异源
两个URL地址的源地址如果完全相同
,则称之为同源
,否则称之为异源(跨域)
源一
源二
是否同源
http
: //www.xyz.com/home
https
: //www.xyz.com/home
非同源
http : //www
.xyz.com/home
http : //mail
.xyz.com/home
非同源
http : //www.xyz.com:8080
/home
http : //www.xyz.com:8081
/home
非同源
http : //www.xyz.com:8080/home
http : //www.xyz.com:8080/info
同源
跨域的限制场景
- 限制 DOM 访问
- 限制 Cookie 访问(默认情况下)
- 限制 Ajax 获取资源数据
请求页面的源称之为 页面源
,在该页面中发出的请求称之为 目标源
。
当页面源和目标源一致时,则为 同源请求
,否则为 异源请求(跨域请求)
注明:
- 跨域限制
仅存在浏览器端
,服务端不存在跨域限制。- 即使跨域了,
Ajax 请求也可以正常发出
,但响应数据不会交给开发者。<link>
、<script/>
、<img>
… 这些标签发出的请求也可能跨域
,只不过浏览器对标签跨域不做严格限制
,对开发几乎无影响对 AJAX 发出的跨域请求严厉限制
解决方案
CORS
CORS(Cross-Origin Resource Sharing(跨域资源共享)): 。是
最正统的跨域解决方案
,同时也是浏览器推荐的解决方案
。CORS是一套规则
,用于帮助浏览器判断是否校验通过。
CORS的基本理念是:
- 只要服务器明确表示
允许请求
,则通过校验
- 服务器
明确拒绝
或没有表示
,则校验不通过
所以,使用CORS解决跨域
,必须要保证服务器是我方可完全控制的
请求分类
- CORS 将请求类型分为两类:
简单请求
和预检请求
- 对不同种类的请求它的规则有所区别。
- 所以要理解CORS,首先要理解它是如何划分请求的。
简单请求
复杂请求(预检请求(preflight)
)
请求方法是:GET
,POST
,HEAD
之一
头部字段满足CORS安全规范
,详见W3C安全规范文档说明
浏览器默认自带的头部字段都是满足安全规范的
,只要开发者不改动和新增头部,就不会打破此条规则
如果有请求头 Content-Type
,必须是下列值中的一个
text/plain
multipart/form-data
application/x-www-form-urlencoded
点击查看简单请求完整判断逻辑
只要不是简单请求,其它均为复杂(预检)请求
简单请求
对于简单请求的验证流程
预检请求
- 发送时机:预检请求在
实际跨域请求之前
发出,是由浏览器自动
发起的 - 主要作用:用于向服务器确认
是否允许接下来的跨域请求
- 基本流程:先发起
OPTIONS
请求,如果通过
预检,则继续发起实际的跨域请求 - 请求头内容:一个
OPTIONS
预检请求,通常会包含如下请求头
请求头
描述
Origin
发起请求的源
Access-Control-Request-Method
实际请求的 HTTP 方法
Access-Control-Request-Headers
实际请求中使用的自定义头(如果有的话)
服务器先通过浏览器的预检请求,服务器需要返回如下响应头:
请求头
描述
Access-Control-Allow-Origin
允许的源
Access-Control-Allow-Methods
允许的的 HTTP 方法
Access-Control-Allow-Headers
实际请求中允许的自定义头
Access-Control-Max-Age
预检请求的结果缓存时间
(可选)
对预检请求的验证流程
1. 发送预检请求
2. 开始发送真实请求(和简单请求一致)
注意点一 【关于Cookie】
默认
情况下,AJAX的跨域请求并不会附带Cookie
,这样一来,某些需要权限的操作就无法进行。不过可以通过简单的配置就可以实现附带Cookie
// XHR
var xhr = new XMLHttpRequest();
xhr.withCredentials = true;// fetch api
fetch(url, {credentials: "include"
})
这样一来,该跨域的AJAX请求就是一个_附带身份凭证的请求_
当一个请求需要附带Cookie时,无论它是简单请求,还是预检请求,都会在请求头中添加Cookie
字段
而服务器响应时,需要 明确告知客户端:服务器允许这样的凭据
告知的方式也非常的简单,只需要在响应头中添加:Access-Control-Allow-Credentials: true
即可。
对于一个附带身份凭证的请求,若服务器没有明确告知,浏览器仍然视为跨域被拒绝。
另外要特别注意的是:对于附带身份凭证的请求,服务器不得设置 Access-Control-Allow-Origin 的值为*
。这就是为什么不推荐使用*的原因
注意点二 【关于跨域获取响应头】
在跨域访问时,JS只能拿到一些最基本的响应头
,如:Cache-Control、Content-Language、Content-Type、Expires、Last-Modified、Pragma,如果要访问其他头,则需要服务器设置本响应头
。
Access-Control-Expose-Headers
头让服务器把允许浏览器访问的头放入白名单,例如:
Access-Control-Expose-Headers: authorization, a, b
配置指定过后,这样JS就能够访问指定的响应头了。
JSONP
JSONP 是利用了
<script>
标签可以跨域加载脚本,且不受严格限制的特性,可以说是程序员智慧的结晶,早期一些浏览器不支持 CORS 的时,可以靠 JSONP 解决跨域
基本流程
- 第一步:客户端创建一个
<script>
标签,并将其src 属性
设置为包含跨域请求的 URL,同时准备一个回调函数
,这个回调函数用于处理返回的数据 - 服务端接收到请求后,将
数据封装在回调函数中并返回
- 客户端的
回调函数被调用
,数据以参数的形势传入回调函数
虽然可以解决问题,但JSONP有着明显的缺陷
:
- 仅能使用
GET
请求 - 容易产生
安全隐患
- 恶意攻击者可能利用
callback=恶意函数
的方式实现XSS
攻击
- 恶意攻击者可能利用
- 容易被非法站点恶意调用
因此,除非是某些特殊的原因,否则永远
不应该使用JSONP
代理服务器
由于
同源策略
只会在浏览器环境中存在,一但脱离了浏览器,则跨域
不存在。所以我们可以借助于中间层代理服务器来进行请求和响应的转发
如何选择对应方案
基本原则:是要保持
生产环境和开发环境一致
。
常见几种场景:
这几种场景,始终围绕保持和
生产环境和开发环境一致
的基本理念。
??♂ 博主座右铭:向阳而生,我还在路上!
——————————————————————————————
??博主想说:将持续性为社区输出自己的资源,同时也见证自己的进步!
——————————————————————————————
??♂ 如果都看到这了,博主希望留下你的足迹!【??收藏!??点赞!评论!】
——————————————————————————————
相关文章:

前端网络之【浏览器跨域问题分析与解决方案】
文章目录 同源策略同源与异源跨域的限制场景解决方案 CORS 请求分类 简单请求预检请求 注意点一 【关于Cookie】注意点二 【关于跨域获取响应头】 JSONP 基本流程 代理服务器 如何选择对应方案 同源策略 **同源策略是一套浏览器的安全策略机制,当一个源的文档和脚…...

LeetCode:3218. 切蛋糕的最小总开销 I(贪心 Java)
目录 3218. 切蛋糕的最小总开销 I 题目描述: 实现代码与解析: 贪心 原理思路: 3218. 切蛋糕的最小总开销 I 题目描述: 有一个 m x n 大小的矩形蛋糕,需要切成 1 x 1 的小块。 给你整数 m ,n 和两个数…...

前端下载后端文件流,文件可以下载,但是打不开,显示“文件已损坏”的问题分析与解决方案
目录 场景还原 相关代码开发者工具 - 网络请求记录 问题排查 定位改bug 总结 场景还原 我在前端使用axios接收后端xlsx表格文件流并下载,xlsx文件能够下载成功,但是打开却显示文件无法打开 相关代码 请求API封装:Content–Type以及responseType经核…...

PageRank Web页面分级算法 HNUST【数据分析技术】(2025)
1.理论知识 算法原理PageRank 通过网络浩瀚的超链接关系来确定一个页面的等级。 Google 把从 A 页面到 B 页面的链接解释为A页面给B页面投票, Google 根据投票来源(甚至来源的来源, 即链接到A页面的页面)和投票目标的等级来决定新…...

数字IC前端学习笔记:脉动阵列的设计方法学(四)
相关阅读 数字IC前端https://blog.csdn.net/weixin_45791458/category_12173698.html?spm1001.2014.3001.5482 引言 脉动结构(也称为脉动阵列)表示一种有节奏地计算并通过系统传输数据的处理单元(PEs)网络。这些处理单元有规律地泵入泵出数据以保持规则…...

对话 Project Astra 研究主管:打造通用 AI 助理,主动视频交互和全双工对话是未来重点
Project Astra 愿景之一:「系统不仅能在你说话时做出回应,还能在持续的过程中帮助你。」 近期,Google DeepMind 的 YouTube 频道采访了 Google DeepMind 研究主管格雷格韦恩 (Greg Wayne)。 格雷格韦恩的研究工作为 DeepMind 的诸多突破性成…...
NetApp 存储设备巡检作业指导书
NetApp 存储设备巡检作业指导书 一、目的 本指导书旨在指导管理员通过 SSH 或 Console 登录 NetApp FAS2552 存储系统,切换节点并进行日常管理操作。 二、适用范围 适用于基于 NetApp ONTAP 操作系统的 FAS2552 存储环境。 三、前提条件 网络和权限要求࿱…...
adb无法连接到安卓设备【解决方案】报错:adb server version (40) doesn‘t match this client (41);
下载老版本Platformtoolshttps://dl.google.com/android/repository/platform-tools_r28.0.2-windows.zip?hlzh-cn 替换原来的platform-tools文件夹即可。 问题原因分析:电脑端adb client版本(41)和安卓端adb …...
每天五分钟机器学习:核函数
本文重点 在学习支持向量机算法之前,我们要继续学习一些数学基础,本文我们将学习核函数的概念。当数据线性不可分的时候,此时就需要核函数出场了,它可以将低维不可分的数据映射到高维可分数据,此时就可以完成数据分类了。 核函数的定义 核函数K(x, y)定义为两个数据点x…...

Word窗体联动Excel实现级联组合框
在Word中的使用用户窗体(UserForm)定制界面如下图所示,其中控件如下(忽略Label控件): CompanyName 组合框Attention 组合框CommandButton1 按钮 现在需要实现级联组合框效果,即用户在 CompanyN…...

RAG实战:构建基于本地大模型的智能问答系统
RAG实战:构建基于本地大模型的智能问答系统 引言 在当今AI快速发展的时代,如何构建一个既智能又可靠的问答系统是一个重要课题。本文将介绍如何使用RAG(检索增强生成)技术,结合本地大模型,构建一个高效的智…...

Docker 部署 plumelog 最新版本 实现日志采集
1.配置plumelog.yml version: 3 services:plumelog:#此镜像是基于plumelog-3.5.3版本image: registry.cn-hangzhou.aliyuncs.com/k8s-xiyan/plumelog:3.5.3container_name: plumelogports:- "8891:8891"environment:plumelog.model: redisplumelog.queue.redis.redi…...
TCP/IP 邮件
TCP/IP邮件是互联网通信中非常重要的应用之一。当我们发送电子邮件时,我们实际上并没有直接使用TCP/IP协议,而是通过电子邮件程序,例如微软的Outlook、莲花软件的Notes或Netscape Communicator等来实现。这些电子邮件程序背后使用了不同的TCP…...
FreeSql
官网 实体特性 Ado 它包括所有对 SQL 操作的封装,提供 ExecuteReader、ExecuteDataSet、ExecuteDataTable、ExecuteNonQuery、ExecuteScalar 等方法,使用起来和传统 SqlHelper 一样。 1、安装包 Install-Package FreeSql Install-Package FreeSql.Prov…...
记一次前端Vue项目国际化解决方案
背景 有一个vue项目,要实现国际化功能,能够切换中英文显示,因为该项目系统的用户包括了国内和国外用户。 需求 1、页面表单上的所有中文标签要国际化,包括表单属性标签、表格列头标签等, title“数量”;…...
JS进阶-手写Promise
一、什么是Promise 在Promise A规范中规定,Promise是一个有一个符合规范的then方法的对象或者函数。 1.关于then then接收onFulfilled和onRejected两个可选参数;then必须返回一个新的Promise对象;如果onFulfilled是一个函数 在状态切换为f…...

PCL点云库入门——PCL库点云滤波算法之直通滤波(PassThrough)和条件滤波(ConditionalRemoval)
0、滤波算法概述 PCL点云库中的滤波算法是处理点云数据不可或缺的一部分,它们能够有效地去除噪声、提取特征或进行数据降维。例如,使用体素网格滤波(VoxelGrid)可以减少点云数据量,同时保留重要的形状特征。此外&#…...
ioctl回顾
一、ioctl协议的命令组成 cmd本质为一个32位的数字,共分为四段: [31-30]:读写方向dir,分为无数据(_IO)、读数据(_IOR)、写数据(_IOW)、读写数据(_IOWR)四种模式; [29-16]:传递数据的大小size,一般利用其宏_IO、_IOR…...

jquery-validate在前端数据校验中的应用以及remote异步调用实践-以若依为例
目录 前言 一、关于Jquery Validate组件 1、validate是什么 2、内置验证方式及触发方式 3、自定义验证规则 二、基本验证实战以及Remote验证 1、基本验证实现 2、remote校验方式 三、总结 前言 随着技术的不断演进,在我们的日常开发过程中,大家一…...

如何重新设置VSCode的密钥环密码?
故障现象: 忘记了Vscode的这个密码: Enter password to unlock An application wants access to the keyring “Default ke... Password: The unlock password was incorrect Cancel Unlock 解决办法: 1.任意terminal下,输入如下…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...

04-初识css
一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...

ios苹果系统,js 滑动屏幕、锚定无效
现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...

AI书签管理工具开发全记录(十九):嵌入资源处理
1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...
ip子接口配置及删除
配置永久生效的子接口,2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...
【JavaSE】多线程基础学习笔记
多线程基础 -线程相关概念 程序(Program) 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存…...

从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践
作者:吴岐诗,杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言:融合数据湖与数仓的创新之路 在数字金融时代,数据已成为金融机构的核心竞争力。杭银消费金…...
「全栈技术解析」推客小程序系统开发:从架构设计到裂变增长的完整解决方案
在移动互联网营销竞争白热化的当下,推客小程序系统凭借其裂变传播、精准营销等特性,成为企业抢占市场的利器。本文将深度解析推客小程序系统开发的核心技术与实现路径,助力开发者打造具有市场竞争力的营销工具。 一、系统核心功能架构&…...

Chrome 浏览器前端与客户端双向通信实战
Chrome 前端(即页面 JS / Web UI)与客户端(C 后端)的交互机制,是 Chromium 架构中非常核心的一环。下面我将按常见场景,从通道、流程、技术栈几个角度做一套完整的分析,特别适合你这种在分析和改…...