深入解析跨域问题及其解决方案:从原理到代码实践
跨域问题是前端开发中常见的安全限制问题,主要源于浏览器的同源策略(Same-Origin Policy)。同源策略限制了从一个源加载的文档或脚本如何与另一个源的资源进行交互。为了更深入地理解跨域问题及其解决方案,我们需要从原理、限制条件以及具体解决方案等多个角度进行分析。
1. CORS(跨域资源共享)
1.1 简单请求的 CORS 处理
-
前端代码:
fetch('https://api.example.com/data', {method: 'GET',headers: {'Content-Type': 'text/plain'} }) .then(response => response.json()) .then(data => console.log(data)) .catch(error => console.error(error)); -
服务器响应头:
Access-Control-Allow-Origin: https://www.example.com
1.2 非简单请求的 CORS 处理
-
前端代码:
fetch('https://api.example.com/data', {method: 'PUT',headers: {'Content-Type': 'application/json','Authorization': 'Bearer token'},body: JSON.stringify({ key: 'value' }) }) .then(response => response.json()) .then(data => console.log(data)) .catch(error => console.error(error)); -
服务器响应头:
Access-Control-Allow-Origin: https://www.example.com Access-Control-Allow-Methods: GET, POST, PUT, DELETE Access-Control-Allow-Headers: Content-Type, Authorization
1.3 携带 Cookie 的跨域请求
-
前端代码:
fetch('https://api.example.com/data', {method: 'GET',credentials: 'include' }) .then(response => response.json()) .then(data => console.log(data)) .catch(error => console.error(error)); -
服务器响应头:
Access-Control-Allow-Origin: https://www.example.com Access-Control-Allow-Credentials: true
2. JSONP(JSON with Padding)
2.1 实现原理
-
前端代码:
function handleResponse(data) {console.log(data); }const script = document.createElement('script'); script.src = 'https://api.example.com/data?callback=handleResponse'; document.body.appendChild(script); -
服务器返回:
handleResponse({ name: 'Alice', age: 25 });
3. 代理服务器
3.1 使用 Nginx 实现代理
-
Nginx 配置:
server {location /api/ {proxy_pass https://api.example.com/;} } -
前端代码:
fetch('/api/data', {method: 'GET' }) .then(response => response.json()) .then(data => console.log(data)) .catch(error => console.error(error));
3.2 使用 Node.js 实现代理
-
Node.js 代码:
const http = require('http'); const httpProxy = require('http-proxy');const proxy = httpProxy.createProxyServer({});http.createServer((req, res) => {proxy.web(req, res, { target: 'https://api.example.com' }); }).listen(3000); -
前端代码:
fetch('http://localhost:3000/api/data', {method: 'GET' }) .then(response => response.json()) .then(data => console.log(data)) .catch(error => console.error(error));
4. WebSocket
4.1 实现实时通信
- 前端代码:
const socket = new WebSocket('wss://api.example.com');socket.onopen = function() {console.log('WebSocket connection established.');socket.send('Hello Server!'); };socket.onmessage = function(event) {console.log('Message from server:', event.data); };socket.onclose = function() {console.log('WebSocket connection closed.'); };
5. postMessage
5.1 跨文档通信
-
父页面代码:
const iframe = document.getElementById('iframe'); iframe.contentWindow.postMessage('Hello', 'https://child.example.com'); -
子页面代码:
window.addEventListener('message', function(event) {if (event.origin === 'https://parent.example.com') {console.log('Message from parent:', event.data);} });
6. 结合代码的注意事项
6.1 安全性
- CORS:避免使用
Access-Control-Allow-Origin: *,除非明确允许所有源。 - JSONP:确保回调函数名是动态生成的,避免 XSS 攻击。
6.2 性能
- CORS 预检请求:尽量减少非简单请求的数量,优化服务器响应时间。
- 代理服务器:确保代理服务器的性能足够高,避免成为瓶颈。
6.3 兼容性
- CORS:现代浏览器广泛支持,但需要服务器配合。
- JSONP:兼容性较好,但功能有限,仅支持
GET请求。
7. 总结
通过代码示例,我们可以清晰地看到每种跨域解决方案的具体实现和应用场景:
- CORS:适用于现代浏览器,支持复杂请求。
- JSONP:适用于简单场景,但功能有限。
- 代理服务器:通过同源服务器中转请求,适用于复杂场景。
- WebSocket:适用于实时通信。
- postMessage:适用于跨文档通信。
理解这些解决方案的代码实现,有助于在实际开发中灵活应对跨域问题,同时确保安全性和性能。
相关文章:
深入解析跨域问题及其解决方案:从原理到代码实践
跨域问题是前端开发中常见的安全限制问题,主要源于浏览器的同源策略(Same-Origin Policy)。同源策略限制了从一个源加载的文档或脚本如何与另一个源的资源进行交互。为了更深入地理解跨域问题及其解决方案,我们需要从原理、限制条…...
BLUEM2引擎源码2025最新版
BLUE 引擎解析:传奇私服圈中的热门引擎 一、BLUE 引擎简介 BLUE 引擎是传奇私服圈子中较为知名的一款游戏引擎,它在传统的传奇引擎基础上进行了优化和扩展,使得私服开发者可以更加方便地搭建和管理服务器。相比于早期的 GEE、LEG、Hero 等引…...
【RAG】检索后排序 提高回答精度
问题: RAG中,有时,最合适的答案不一定排在检索的最前面 user_query "how safe is llama 2" search_results vector_db.search(user_query, 5)for doc in search_results[documents][0]:print(doc"\n")response bot.chat(user_qu…...
7.2 奇异值分解的基与矩阵
一、奇异值分解 奇异值分解(SVD)是线性代数的高光时刻。 A A A 是一个 m n m\times n mn 的矩阵,可以是方阵或者长方形矩阵,秩为 r r r。我们要对角化 A A A,但并不是把它化成 X − 1 A X X^{-1}A X X−1AX 的形…...
Windows控制台函数:控制台输出函数WriteConsoleA()
目录 什么是 WriteConsoleA? 函数签名 参数详解 返回值 一个最简单的例子 跟 ReadConsoleA 对比 再试一个有趣的例子 为什么传地址给 lpNumberOfCharsWritten? 注意事项 什么是 WriteConsoleA? WriteConsoleA 是一个 Windows API 函…...
采用内存局部性分配有什么好处?
内存分配时的局部性分配(Locality of Allocation)是指将相关的内存对象分配在相邻或相近的内存区域中。这种分配策略在现代计算机系统中具有显著的好处,主要体现在以下几个方面: 1. 提高缓存命中率 现代计算机系统依赖于多级缓存…...
【Dubbo+Zookeeper】——SpringBoot+Dubbo+Zookeeper知识整合
🎼个人主页:【Y小夜】 😎作者简介:一位双非学校的大二学生,编程爱好者, 专注于基础和实战分享,欢迎私信咨询! 🎆入门专栏:🎇【MySQL࿰…...
使用阿里云操作系统控制台排查内存溢出
引言 操作系统控制台是阿里云最新推出的一款智能运维工具,专为提升运维效率、优化服务器管理而设计。它集成了多种运维管理功能,包括操作系统助手、插件管理器以及其他实用工具,为用户提供一站式的运维解决方案。无论是个人开发者还是企业运…...
3.3.2 Proteus第一个仿真图
文章目录 文章介绍0 效果图1 新建“点灯”项目2 添加元器件3 元器件布局接线4 补充 文章介绍 本文介绍:使用Proteus仿真软件画第一个仿真图 0 效果图 1 新建“点灯”项目 修改项目名称和路径,之后一直点“下一步”直到完成 2 添加元器件 点击元…...
MyBatis-Plus 与 Spring Boot 的最佳实践
在现代 Java 开发中,MyBatis-Plus 和 Spring Boot 的结合已经成为了一种非常流行的技术栈。MyBatis-Plus 是 MyBatis 的增强工具,提供了许多便捷的功能,而 Spring Boot 则简化了 Spring 应用的开发流程。本文将探讨如何将 MyBatis-Plus 与 Spring Boot 进行整合,并分享一些…...
深入了解Linux —— 调试程序
前言 我们已经学习了linux下许多的工具,vim、gcc、make/makefile等; 已经能够在linux写代码,并且进行编译运行,让程序在linux下跑起来。 但是,如果我们在写代码的时候遇见了错误;但是我们并不知道错误在哪&…...
Hive-优化(语法优化篇)
列裁剪与分区裁剪 在生产环境中,会面临列很多或者数据量很大时,如果使用select * 或者不指定分区进行全列或者全表扫描时效率很低。Hive在读取数据时,可以只读取查询中所需要的列,忽视其他的列,这样做可以节省读取开销…...
物联网(Internet of Things, IoT)中的网络层简介
物联网(Internet of Things, IoT)中的网络层是物联网架构中的关键组成部分,负责设备之间的数据传输和通信。网络层的主要任务是将感知层(传感器、设备等)收集到的数据通过互联网或其他通信网络传输到应用层(数据处理和分析平台)。以下是物联网网络层的知识简介: 1. 物联…...
C++ 提供了多种数据类型组合方式
C 提供了多种数据类型组合方式,允许开发者将基本类型组合成更复杂的数据结构,以满足不同场景的需求。以下是主要的组合方式及其示例: 1. 数组(Array) 同类型元素的集合,可以是静态或动态。 int staticArr…...
八字排盘宝 2025.1.8 | 多模式排盘工具,精准解析八字信息,轻量易用
八字排盘宝是一款轻量高效的排盘工具,实现多模式排盘功能,界面简洁易用,适合命理爱好者和专业人士。支持多种排盘方式,精准解析八字信息,提供快速、便捷的命理分析体验,是日常排盘和命理学习的得力助手。 …...
MySQL面试篇——性能优化
MySQL性能优化 在MySQL中,如何定位慢查询 慢查询表象:页面加载过慢、接口压测响应时间过长(超过1s)。造成慢查询的原因通常有:聚合查询、多表查询、表数据量过大查询、深度分页查询 方案一:开源工具 调试工…...
c#财务软件专业版企业会计做账软件财务管理系统软件
本软件为绍兴客户开发的仿某碟财务软件专业版 功能:可以按会计科目做账录入会计凭证、结转损益、期末结账、拉资产负债表 github下载:https://github.com/oyangxizhe/financial.git...
常见 JVM 工具介绍
1. jps(Java Virtual Machine Process Status Tool) 功能:列出当前用户的所有 Java 进程及其 PID。 常用场景:快速定位目标 Java 应用的进程 ID。 常用命令: bash复制 jps -l # 显示主类全名 jps -v # 显示 JVM 启…...
【含文档+PPT+源码】Python爬虫人口老龄化大数据分析平台的设计与实现
项目介绍 本课程演示的是一款Python爬虫人口老龄化大数据分析平台的设计与实现,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Python学习者。 1.包含:项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本…...
生成对抗网络(GAN)原理与应用
目录 一、引言 二、GAN的基本原理 (一)生成器(Generator)的工作机制 (二)判别器(Discriminator)的工作机制 (三)对抗训练的过程 三、GAN在AIGC生图中的应…...
Linux安装升级docker
Linux 安装升级docker Linux 安装升级docker背景升级停止docker服务备份原docker数据目录移除旧版本docker安装docker ce恢复数据目录启动docker参考 安装找到docker官网找到docker文档删除旧版本docker配置docker yum源参考官网继续安装docker设置开机自启配置加速测试 Linux …...
clickhouse源码分析
《ClickHouse源码分析》 当我们谈论数据库时,ClickHouse是一个不容忽视的名字。它是一个用于联机分析处理(OLAP)的列式数据库管理系统(DBMS),以其快速的数据查询能力而闻名。对于想要深入了解这个高效工具…...
IDEA 基础配置: maven配置 | 服务窗口配置
文章目录 IDEA版本与MAVEN版本对应关系maven配置镜像源插件idea打开服务工具窗口IDEA中的一些常见问题及其解决方案IDEA版本与MAVEN版本对应关系 查找发布时间在IDEA版本之前的dea2021可以使用maven3.8以及以前的版本 比如我是idea2021.2.2 ,需要将 maven 退到 apache-maven-3.…...
【redis】type命令和定时器的两种实现方式(优先级队列、时间轮)
type——返回 key 对应的数据类型 此处 Redis 所有的 key 都是 string,但是 key 对应的 value 可能会存在多种类型 none —— key 不存在string ——字符串list ——列表set ——集合zset ——有序集合hash ——哈希表stream ——Redis 作为消息队列的时候&#x…...
高并发下订单库存防止超卖策略
文章目录 什么是超卖问题?推荐策略:Redis原子操作(Redis incr)乐观锁lua脚本利用Redis increment 的原子操作,保证库存数安全update使用乐观锁LUA脚本保持库存原子性 什么是超卖问题? 在并发的场景下,比如商城售卖商品…...
task01
1:大模型能够专业的回答各种问题,并且擅长文本处理,代码编写,可以减少一部分人类的工作。 本节学习了大模型提示词的三要素,角色,背景,输出样式,在kimi上我复现了教材的任务…...
【Kotlin】Kotlin基础笔记
一、数据类型 1.1 变量声明与类型推导 变量声明 使用 val 声明不可变变量(相当于常量);使用 var 声明可变变量。 val a 10 // 类型自动推断为 Int,不可变 var b: Double 5.0 // 显示声明为 Double,可变变量…...
DeepSeek教我写词典爬虫获取单词的音标和拼写
Python在爬虫领域展现出了卓越的功能性,不仅能够高效地抓取目标数据,还能便捷地将数据存储至本地。在众多Python爬虫应用中,词典数据的爬取尤为常见。接下来,我们将以dict.cn为例,详细演示如何编写一个用于爬取词典数据…...
祛魅 Manus ,从 0 到 1 开源实现
背景介绍 Manus 是最近一个现象级的大模型 Agent 工具,自从发布以来,被传出各种神乎其神的故事,自媒体又开始炒作人类大量失业的鬼故事,Manus 体验码也被炒作为 10w 的高价。 之后又出现反转,被爆出实际体验效果不佳…...
C++入门——输入输出、缺省参数
C入门——输入输出、缺省参数 一、C标准库——命名空间 std C标准库std是一个命名空间,全称为"standard",其中包括标准模板库(STL),输入输出系统,文件系统库,智能指针与内存管理&am…...
