前端的跨域问题

前端新手也能看懂的跨域问题详解

在前端开发中,我们经常会听到“跨域问题”。尤其是在本地调试前端和后台接口时,浏览器突然抛出一堆报错信息,比如:

Access to XMLHttpRequest at '[http://api.xxx.com/data](http://api.xxx.com/data)' from origin '[http://localhost:8080](http://localhost:8080)' has been blocked by CORS policy...

这到底是什么鬼?别慌,今天我们就一口气搞清楚什么是跨域、为什么会出现跨域、怎么解决跨域!


一、什么是“跨域”?

跨域指的是:浏览器因为安全限制,阻止了网页对不同源(域名/IP/端口号不同)的请求

所谓“”,就是由以下三部分组成的:

  • 协议(http/https)
  • 域名(或IP)
  • 端口号

只要其中任意一项不同,就叫做“不同源”,比如:

地址http://localhost:8080 比较是否同源
http://localhost:8080完全相同同源
http://localhost:3000端口不同跨域
https://localhost:8080协议不同跨域
http://127.0.0.1:8080IP不同跨域
http://api.example.com域名不同跨域

二、为什么会有跨域限制?

这是浏览器的同源策略(Same-Origin Policy)在起作用。

这个策略是为了保护用户的信息安全,防止恶意网站读取你在其他网站上的隐私数据(比如你登陆了 A 网站,但正在访问 B 网站,B 网站偷偷用 JS 请求 A 网站获取你的个人信息,这就很危险了)。

所以,浏览器默认就限制了跨域请求


三、哪些操作会触发跨域?

最常见的触发方式是通过前端的 JavaScript 发送请求,例如:

fetch('http://api.xxx.com/data') // 如果地址和页面地址不是同源,就会被拦截

其他还有:

  • 使用 XMLHttpRequestaxios
  • 页面内嵌 iframe
  • 加载外部的脚本、字体、样式(但有些资源不受限制)

四、怎么解决跨域问题?

跨域不是不能请求,而是默认不允许。我们可以通过一些方式让浏览器**“信任”**这次跨域请求。

方法一:CORS(跨源资源共享)【推荐】

这是最常见也最官方的方式。

需要后端在响应头中加上允许跨域的字段:

Access-Control-Allow-Origin: http://localhost:8080

如果允许所有域访问,也可以写:

Access-Control-Allow-Origin: *

完整示例(Node.js Express 后端):

app.use((req, res, next) => {res.setHeader('Access-Control-Allow-Origin', '*'); // 允许所有域访问res.setHeader('Access-Control-Allow-Methods', 'GET,POST'); // 允许的方法res.setHeader('Access-Control-Allow-Headers', 'Content-Type'); // 允许的请求头next();
});

方法二:通过代理绕过浏览器

在开发环境中,你也可以设置一个本地代理,让浏览器以为你访问的是同源。

比如用 vitewebpack 设置代理:

// vite.config.js
export default {server: {proxy: {'/api': {target: 'http://api.xxx.com',changeOrigin: true,rewrite: path => path.replace(/^\/api/, '')}}}
}

你在前端请求 /api/data,实际上是请求 http://api.xxx.com/data,从而绕过跨域限制

方法三:JSONP(已过时,只支持GET)

是一种早期的跨域方案,用 <script> 标签加载数据,原理是浏览器允许跨域加载 JS 文件。但现在一般不推荐,功能有限,且不支持 POST。


五、总结一句话

跨域问题是浏览器安全机制限制的结果,我们可以通过配置 CORS 或使用代理来解决。


FAQ:你可能还想问

  • 跨域只在浏览器中出现吗?
    是的,Node.js 端、Postman、curl 请求都不会受到“同源策略”的影响。

  • 后端一定要支持 CORS 吗?
    如果你要前端直接访问后端 API,那后端必须支持;否则只能通过代理。

  • 是不是所有请求都会被预检?
    不是,简单请求不会,比如 GET 请求且 Content-Type 是 application/x-www-form-urlencoded

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TCP 连接在异常情况下的断开机制

文章目录 一、进程(客户端)被 kill 掉1、kill [-15]2、kill -9 二、进程(客户端) core 掉 一、进程(客户端)被 kill 掉 详细验证流程 1、kill [-15] 2、kill -9 二、进程(客户端) core 掉

【甲方安全建设】持续渗透测试(一)

持续渗透测试是一种现代安全方法&#xff0c;它对针对组织数字资产的网络攻击进行实时或近实时模拟&#xff0c;确保在漏洞出现时识别并解决漏洞… 文章目录 行业洞察持续渗透测试不是什么&#xff1f;1. 非单一自动化漏洞扫描2. 非传统人工渗透测试的替代品3. 非万能解决方案4…

LOCAL PATTERNS GENERALIZE BETTER FOR NOVEL ANOMALIES

标题&#xff1a;局部模式在新颖异常上的泛化能力更强 原文链接&#xff1a;https://openreview.net/forum?id4ua4wyAQLm 源码链接&#xff1a;https://github.com/AllenYLJiang/Local-Patterns-Generalize-Better/ 发表&#xff1a;ICLR-2025 摘要 视频异常检测&#xff08;…

ABP vNext + Azure Application Insights:APM 监控与性能诊断最佳实践

ABP vNext Azure Application Insights&#xff1a;APM 监控与性能诊断最佳实践 &#x1f680; &#x1f4da; 目录 ABP vNext Azure Application Insights&#xff1a;APM 监控与性能诊断最佳实践 &#x1f680;1️⃣ 集成目标与环境要求 2️⃣ 安装 SDK 与注入服务 3️⃣ 日…

OPENGLPG第九版学习 - 纹理与帧缓存 part1

文章目录 6.1 纹理综述6.2 基木纹理类型6.3 创建并初始化纹理代理纹理 6.4 指定纹理数据6.4.1 显式设置纹理数据将静态数据载入到纹理对象 6.4.2 从缓存(目标对象GL_PIXEL_UNPACK_BUFFER)中加载纹理6.4.3 从文件加载图像(DDS为例)读取一个图像文件并返回内存中的纹素数据将纹素…

谁来定义未来座舱?新一代车载显示「C位」之战开启

在汽车智能网联化转型过程中&#xff0c;车载显示屏幕作为人车交互的重要载体&#xff0c;已经站上了迅猛发展的新起点。 一方面&#xff0c;伴随着汽车智能化的加速渗透与发展&#xff0c;传统中控屏与仪表显示屏的单一显示模式已经难以匹配智能化交互需求&#xff0c;车载显…

基于JavaScript的MQTT实时通信应用开发指南

MQTT 协议入门与实践&#xff1a;使用 JavaScript 构建实时通信应用 1. 什么是 MQTT&#xff1f; MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;是一种轻量级的 发布/订阅&#xff08;Pub-Sub&#xff09; 消息协议&#xff0c;专为低带宽、高延迟或不稳…

React 19中如何向Vue那样自定义状态和方法暴露给父组件。

文章目录 前言一、什么是 useImperativeHandle&#xff1f;1.1 为什么需要 useImperativeHandle&#xff1f;1.2 基本语法 二、useImperativeHandle 的常见用法3.1 暴露自定义方法3.2子组件封装的弹窗关闭方法暴露给外部 注意点&#xff1a;总结 前言 在 React 的函数组件中&a…

Windows定时关机工具

自己设计了一款简单易用的windows定时关机工具&#xff0c;使用简单&#xff0c;使用只需两步&#xff1a; 1、输入设定的时间 2、点击开始计时 Ps: 1、文章顶部直接下载exe文件 2、文件设置不了免费下载&#xff0c;只能用云盘&#xff1a;定时关机工具.exe - 蓝奏云。 w…

枫清科技受邀参加2025数据智能大会

近日&#xff0c;由中国通信标准化协会主办&#xff0c;中国信通院、大数据技术标准推进委员会(CCSA TC601)承办的“2025数据智能大会”在北京隆重召开&#xff0c;本届大会以“Data X AI&#xff0c;数据燃动智能”为主题&#xff0c;聚焦央国企数智化转型、下一代数据治理、数…

黑马头条-数据管理平台

目录 项目介绍 功能 项目准备 技术 验证码 验证码登录 验证码登录-流程 关于token token的介绍 token的使用 个人信息设置 个人信息设置和axios请求拦截器 axios响应拦截器和身份验证失败 优化-axios响应结果 发布文章 发布文章-富文本编辑器 发布文章-频道列…

Pytorch3D 中涉及的知识点汇总

PyTorch3D 是 Facebook&#xff08;现 Meta&#xff09;AI 研究院&#xff08;FAIR&#xff09;推出的一个基于 PyTorch 的三维计算库&#xff0c;主要用于 3D 计算机视觉与图形学任务&#xff0c;如 3D 重建、渲染、点云处理、网格操作等。 下面是对 PyTorch3D 中重要涉及知识…

XML在线格式化工具

XML格式化 免费在线XML格式化与压缩工具&#xff0c;一键美化、校验、压缩和优化您的XML代码。支持自定义缩进、节点折叠&#xff0c;提升可读性&#xff0c;减小文件体积&#xff0c;加速数据传输。 https://toolshu.com/xml 本工具是一款专为处理XML&#xff08;可扩展标记…

【软件系统架构】系列四:嵌入式技术

目录 一、嵌入式系统组成 (1)嵌入式处理器 (2)支撑硬件 (3)嵌入式操作系统 (4)支撑软件 (5)应用软件 二、嵌入式系统特性 三、嵌入式系统分类与分层结构 1.分类 2.嵌入式软件的五层架构深入解析 (1)硬件层(Hardware Layer) (2)抽象层(Hardware Ab…

监管报送面试回答思路和示例

在银行监管报送岗位的面试中&#xff0c;回答问题时需要展现出你的专业知识、实际操作经验、问题解决能力以及对监管合规的重视。以下是对各类问题的回答思路和示例&#xff1a; 一、专业知识类问题 1. 请简述银行监管报送的主要类型和报送频率 回答思路&#xff1a;分类介绍…

音视频SDK架构演进的实践与思考

“不是每一行代码都值得骄傲&#xff0c;但每一次迭代&#xff0c;都是一次更接近极致的尝试。” 从最初的数千行代码、到如今跨平台、全功能、稳定可靠的直播技术基座&#xff0c;大牛直播SDK走过了整整十年。十年&#xff0c;既是时间的刻度&#xff0c;更是技术沉淀与产品信…

vue.config.js配置学习

1.部署应用包时的基本 URL (baseUrl或publicPath) baseUrl在vue-cli 3.3 时弃用了&#xff0c;自此之后使用publicPath 默认&#xff1a;/ module.exports {// baseUrl:"/",publicPath: ./, ) 2.打包时输出的文件位置&#xff1a;outputDir 默认: dist module.…

大模型——Prompt Design

Prompt Design 为什么未来最重要的写作,不是写给人看的,而是写给AI理解的? 01|一切从一次“客服神操作”开始 前几天前,我在看一场 YC Demo Day 分享的时候,听到一个很炸裂的细节: 有个叫 Parahelp 的 AI 客服创业项目,靠一段几百行的“提示词”,打败了市面上大多数…

web布局20

在当下&#xff0c;可用于 Web 布局的 CSS 特性有很多&#xff0c;而且这个集合越来越强大。自从 Flexbox 的兼容性越来越完善&#xff0c;它替代了浮动布局&#xff0c;成为主流的布局技术。只不过&#xff0c;近几年来&#xff0c;CSS Grid 快速得到主流浏览器的支持&#xf…

数据集-目标检测系列- 餐具叉子 数据集 fork >> DataBall

数据集-目标检测系列- 餐具叉子 数据集 fork &#xff1e;&#xff1e; DataBall 贵在坚持&#xff01; * 相关项目 1&#xff09;数据集可视化项目&#xff1a;gitcode: https://gitcode.com/DataBall/DataBall-detections-100s/overview 2&#xff09;数据集训练、推理相…