当前位置: 首页 > news >正文

跨域彻底讲透

跨域彻底讲透。


一、 跨域的定义

跨域指的是:当一个 Web 应用(位于一个域名下)试图去请求另一个域名下的资源时,如果这两个域名的协议、域名、端口有任何一项不相同,浏览器就会认为这是跨源的,并默认禁止这种请求。

浏览器的同源策略

同源策略是浏览器的一个最核心、最基础的安全功能。它规定:只有当协议、域名、端口三者完全相同时,才被认为是“同源”的,否则就是“跨域”或“跨源”。

  • 跨源例子
    • https://www.example.comhttp://www.example.com协议不同,HTTP vs HTTPS)
    • https://www.example.comhttps://api.example.com域名不同,主域 vs 子域)
    • https://www.example.comhttps://www.example.com:8080端口不同,443 vs 8080)

当发生跨域时,浏览器会拦截 Ajax 请求: 使用 XMLHttpRequestFetch API 发起的请求。


二、为什么?—— 为什么要存在跨域限制?

这是一个“浏览器多管闲事”的行为吗?绝对不是。这是为了安全

假设没有同源策略,会非常可怕:

  1. 你登录了银行网站(https://my-bank.com,浏览器保存了你的 Cookie 会话。
  2. 你无意中访问了一个恶意网站(https://evil-site.com
  3. 这个恶意网站上的脚本,可以用你的身份悄悄向 https://my-bank.com/transfer?to=hacker&amount=1000000 发起 AJAX 请求。
  4. 因为你的浏览器带着 my-bank.com 的 Cookie,银行服务器会认为这是你的合法操作,从而执行转账。

这就是可怕的 CSRF(跨站请求伪造) 攻击。同源策略极大地增加了这种攻击的难度

总结:同源策略的目的是为了保护用户信息安全和隐私,防止恶意网站窃取数据或冒充用户身份。


三、解决跨域的常见方案

既然跨域是浏览器搞的鬼,那我们的解决方案就是 “想办法让浏览器点头放行”

以下是主流且高效的解决方案,从上到下推荐程度递减:

方案一:(跨域资源共享)—— 官方终极方案

这是 W3C 标准,也是现代浏览器最推荐、最主流的跨域解决方案。它需要服务器和浏览器共同配合

原理:服务器 在响应头中设置一些特定的字段(如 Access-Control-Allow-Origin),告诉浏览器:“某个外域的请求是被我允许的,你别拦着”。

一个最简单的 CORS 请求:

  1. 前端代码(http://localhost:8080)正常发起一个 Fetch 请求到 http://api.example.com

  2. 服务器(api.example.com)在响应头中添加:

    Access-Control-Allow-Origin: http://localhost:8080
    # 或者允许所有域名(慎用)
    # Access-Control-Allow-Origin: *
    
  3. 浏览器看到这个响应头,比对请求的源(http://localhost:8080)和 Allow-Origin 的值,匹配成功,就会放行,让前端收到响应。

如何实现主要在服务器端配置。无论是 Node.js (Express)、Java (Spring)、Python (Django/Flask)、Nginx,都可以轻松设置 CORS 响应头。

方案二:反向代理 —— 开发阶段最常用方案

在开发和调试阶段,前端和后端 API 通常在不同端口(如前端 localhost:3000,后端 localhost:8080),这也会跨域。

原理“骗过”浏览器。我们让前端不是直接请求后端的地址,而是请求一个和自己同源的代理服务器(比如就是本地开发服务器)。由这个代理服务器偷偷地去请求真正的后端API,拿到结果后再转发给前端。因为服务器之间通信没有同源策略限制,所以没问题。

实现

  • Webpack DevServer / Vite: 在 vite.config.jswebpack.config.js 中配置 proxy

    // vite.config.js
    export default defineConfig({server: {proxy: {'/api': {target: 'http://localhost:8080', // 后端API地址changeOrigin: true,rewrite: (path) => path.replace(/^\/api/, ''),}}}
    })
    
  • Nginx: 在生产环境,也常用 Nginx 作为反向代理来处理跨域和负载均衡。


文章转载自:

http://WLli7iwR.jbtwq.cn
http://qQDrlH7P.jbtwq.cn
http://U4WnLbr5.jbtwq.cn
http://eYW91lEP.jbtwq.cn
http://6AmRULSP.jbtwq.cn
http://bhj1DJCt.jbtwq.cn
http://2dAdUmRS.jbtwq.cn
http://j5K1JKcw.jbtwq.cn
http://lszpBTfz.jbtwq.cn
http://ANQu5oes.jbtwq.cn
http://h6IhgbKQ.jbtwq.cn
http://a8MiLzh7.jbtwq.cn
http://tFYwJ56i.jbtwq.cn
http://L1BM38dr.jbtwq.cn
http://qbIUIPee.jbtwq.cn
http://yLm6DcRv.jbtwq.cn
http://g84ld8V5.jbtwq.cn
http://QrllthSN.jbtwq.cn
http://0xogDTI0.jbtwq.cn
http://f6r35K79.jbtwq.cn
http://npYqnpY6.jbtwq.cn
http://EX65y9jp.jbtwq.cn
http://mu3mmmrz.jbtwq.cn
http://uUB38IAn.jbtwq.cn
http://KzaN1Sec.jbtwq.cn
http://m5lhAq7e.jbtwq.cn
http://qy9kdyDc.jbtwq.cn
http://c4V3Zgfe.jbtwq.cn
http://F1X1Zpbx.jbtwq.cn
http://S0a1XHGJ.jbtwq.cn
http://www.dtcms.com/a/371117.html

相关文章:

  • c++之基础B(x转10进制,含十六进制)(第四课)
  • 自注意力机制解析
  • 数据结构——队列(Java)
  • Dify 从入门到精通(第 79/100 篇):Dify 的多模态模型评估(高级篇)
  • 具身导航“所想即所见”!VISTA:基于生成式视觉想象的视觉语言导航
  • synchronized 锁升级
  • 深入解析 Java 的类加载机制
  • GEE:时间序列合成一个不填补空洞,保留时间序列空像素的新影像
  • Zoom AI 技术架构研究:联合式方法与多模态集成
  • Arch Linux运维自动更新脚本推荐
  • 深度拆解OpenHarmony NFC服务:从开关到卡模拟掌握近场通信技术
  • 第5章递归:分治法
  • 【Python字符串格式化】:全面指南与最佳实践
  • MySQL学习记录-索引
  • C++进阶——继承(2)
  • Oracle体系结构-Redo Log Buffer详解
  • 【医学影像 AI】YoloCurvSeg:仅需标注一个带噪骨架即可实现血管状曲线结构分割
  • Nginx安装及版本迭代热部署详解
  • [光学原理与应用-422]:非线性光学 - 计算机中的线性与非线性运算
  • 图片木马制作的三种方法
  • QT之实现点击按钮启动另一个桌面应用程序
  • 贪心算法在医疗影像分割中的应用详解
  • 责任分配矩阵(RAM)
  • Science Advances副主编:如何提高论文投稿接收率?
  • 【目录-单选】鸿蒙HarmonyOS开发者基础
  • C++语法之--多态
  • Spring Cloud Alibaba快速入门02-Nacos
  • 一阶低通滤波:从原理到实践,平滑数据的艺术
  • 2025最新超详细FreeRTOS入门教程:第一章 FreeRTOS移植到STM32
  • 用Python打造逼真的照片桌面:从拖拽到交互的完整实现