浏览器同源策略限制JS跨域访问详解
知识点掌握了,还需要不断练习才能熟练运用。下面golang学习网给大家带来一个文章开发实战,手把手教大家学习《浏览器同源策略限制JS跨域访问》,在实现功能的过程中也带大家重新温习相关知识点,温故而知新,回头看看说不定又有不一样的感悟!
同源策略限制JavaScript跨源读写DOM、存储和Cookie,防止恶意脚本窃取敏感信息,确保浏览器安全。

浏览器同源策略(Same-Origin Policy, SOP)对JavaScript的影响,简单来说,就是它像一道严格的安检门,决定了你的网页脚本能和哪些服务器或页面资源进行互动。核心在于,它限制了从一个“源”(协议、域名、端口三者都相同才算同源)加载的文档或脚本如何与另一个“源”的资源进行交互,尤其是读写操作。这主要是为了安全,防止恶意网站通过JavaScript窃取用户在其他网站上的敏感数据。但实话讲,它也确实给开发带来了不少“麻烦”,尤其是在构建前后端分离或微服务架构的应用时。
解决同源策略带来的跨域通信问题,我们手里其实有几把趁手的“钥匙”。最常用也最推荐的,当然是CORS (Cross-Origin Resource Sharing)。这是一种W3C标准,通过服务器在响应头中添加特定的HTTP字段,明确告知浏览器允许哪些源访问其资源。它很灵活,可以精细控制允许的域名、HTTP方法和头部信息。
如果你的目标是与子域名通信,并且在同一个主域名下,可以尝试设置document.domain。但这有其局限性,且安全性不如CORS。
对于一些老旧的系统或者需要简单数据获取的场景,JSONP (JSON with Padding) 曾是一个流行的选择。它利用了标签不受同源策略限制的特性,通过动态创建脚本标签来加载跨域数据。但它只支持GET请求,且安全性相对较低,容易受到XSS攻击,现在已不推荐用于新项目。
当涉及到需要持久化双向通信时,WebSocket 是一个强大的选择。一旦握手成功,它就不再受同源策略的限制,可以进行全双工通信。当然,握手阶段依然需要考虑同源问题,但一旦连接建立,数据传输就自由多了。
在父子页面(iframe)之间,window.postMessage 提供了一个安全的跨域通信机制。它允许不同源的窗口之间发送消息,并且可以指定消息的接收方源,避免了不必要的安全风险。
最后,一个在后端解决问题的思路是反向代理 (Reverse Proxy)。让你的前端应用向同源的代理服务器发起请求,然后由代理服务器将请求转发到真正的跨域后端服务。这样,对浏览器而言,所有请求都发给了同一个源,完美规避了同源策略的限制。Nginx就是常用的反向代理工具。
为什么我的AJAX请求会遭遇跨域障碍?理解同源策略的核心限制
说起跨域,我相信很多前端开发者都曾被XMLHttpRequest或fetch API抛出的那个“Access-Control-Allow-Origin”错误搞得一头雾水。这背后,就是同源策略在默默“工作”。
一个“源”究竟是什么?它由协议(protocol)、域名(host)和端口(port)这三个要素共同决定。举个例子,http://www.example.com:8080和https://www.example.com:8080就不是同源,因为协议不同;http://www.example.com和http://api.example.com也不是同源,因为域名不同(子域名也算不同);http://www.example.com:80和http://www.example.com:8080更不用说,端口不同。只要其中任何一个不同,浏览器就认定它们是不同的“源”。
当你的JavaScript代码,比如在http://frontend.com上运行的脚本,尝试通过AJAX去请求http://api.backend.com/data上的资源时,浏览器就会启动同源策略的检查。由于frontend.com和api.backend.com是不同的域名,浏览器会默认阻止这个请求,或者更准确地说,是阻止了JavaScript对这个跨域响应的读取。即使请求成功到达了服务器,服务器也返回了数据,浏览器也会出于安全考虑,不把响应内容暴露给发起请求的JavaScript代码。
这套机制的核心目的是为了保护用户数据安全。想象一下,如果没有同源策略,你访问了一个恶意网站,它上面的JavaScript就能随意地向你正在登录的银行网站、社交媒体网站发送请求,并读取你的账户信息、私密消息,那后果不堪设想。所以,尽管它有时会给开发带来不便,但从安全角度看,它绝对是浏览器不可或缺的一道防线。它不是在“为难”我们,而是在“保护”我们和我们的用户。
细数解决跨域问题的多种策略:CORS、PostMessage与反向代理的实战考量
在实际开发中,我们总会遇到需要跨域通信的场景。除了上面提到的CORS,还有不少“招数”可以灵活运用,但每种都有其适用范围和需要注意的地方。
CORS(Cross-Origin Resource Sharing)无疑是现代Web开发中最主流、最推荐的解决方案。它的基本原理是,当浏览器发起一个跨域请求时,如果这个请求是“简单请求”(GET、HEAD、POST,且请求头只有一些特定字段),浏览器会直接发送;如果是非简单请求(比如PUT、DELETE,或者自定义了请求头),浏览器会先发送一个“预检请求”(OPTIONS方法),询问服务器是否允许该跨域操作。服务器通过在响应头中设置Access-Control-Allow-Origin、Access-Control-Allow-Methods、Access-Control-Allow-Headers等字段来告诉浏览器,哪些源、哪些方法、哪些头部是被允许的。
// 服务器端(Node.js Express 示例)
app.use((req, res, next) => {
res.header('Access-Control-Allow-Origin', 'http://your-frontend-domain.com'); // 允许特定源访问
res.header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS'); // 允许的方法
res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization'); // 允许的请求头
res.header('Access-Control-Allow-Credentials', 'true'); // 允许发送cookie等凭证信息
if (req.method === 'OPTIONS') { // 处理预检请求
res.sendStatus(200);
} else {
next();
}
});配置CORS需要前后端协作,后端工程师需要正确设置这些响应头。如果配置不当,前端依然会收到跨域错误。
window.postMessage 则是解决跨域通信的利器。想象一下,你嵌入了一个第三方支付页面的iframe,或者一个地图组件,你希望父页面和子iframe能够安全地交换信息。postMessage就派上用场了。父页面可以向iframe发送消息,iframe也可以向父页面发送。关键在于,发送方和接收方都可以指定消息的targetOrigin,确保消息只发送给预期的目标,大大增强了安全性。
// 父页面发送消息给iframe
const iframe = document.getElementById('myIframe');
iframe.contentWindow.postMessage('Hello from parent!', 'http://child.domain.com');
// iframe接收消息
window.addEventListener('message', (event) => {
if (event.origin === 'http://parent.domain.com') { // 验证消息来源
console.log('Message from parent:', event.data);
}
});这种方式特别适合于组件化、嵌入式场景。
而反向代理,我个人觉得它是一种非常优雅且强大的解决方案,因为它把跨域问题从浏览器端“转移”到了服务器端。前端应用的所有请求都发往自己的同源服务器(比如http://your-frontend-domain.com/api),然后这个同源服务器作为反向代理,再把请求转发给真正的后端服务(比如http://real-backend-api.com/data)。由于服务器之间没有同源策略的限制,通信畅通无阻。浏览器端根本感知不到跨域的存在,它看到的请求都是发往自己的源。
# Nginx 反向代理配置示例
server {
listen 80;
server_name your-frontend-domain.com;
location /api/ {
proxy_pass http://real-backend-api.com/; # 将 /api/ 的请求转发到后端
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
# ... 其他代理配置
}
# ... 其他前端静态文件配置
}这种方式的优点是前端代码无需改动,对开发者透明;缺点是增加了服务器的负载和维护成本。但在许多大型项目中,这都是首选的解决方案。
同源策略如何限制JavaScript对DOM、存储和Cookie的访问?
同源策略的影响远不止AJAX请求那么简单,它渗透到了JavaScript与浏览器环境交互的方方面面,特别是对DOM操作、本地存储和Cookie的访问。
首先,DOM操作。当你通过`
文中关于JavaScript,cors,反向代理,跨域,同源策略的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《浏览器同源策略限制JS跨域访问详解》文章吧,也可关注golang学习网公众号了解相关技术文章。
CSS渐变动画打造动态背景效果
- 上一篇
- CSS渐变动画打造动态背景效果
- 下一篇
- B站免费入口推荐,在线观看流畅稳定
-
- 文章 · 前端 | 53分钟前 | React useTransition startTransition 并发渲染
- React useTransition 区分交互更新与后台渲染
- 112浏览 收藏
-
- 文章 · 前端 | 3小时前 | vite 前端缓存 Vite依赖预构建 optimizeDeps node_modules/.vite
- Vite 依赖预构建缓存失效时的排查步骤
- 451浏览 收藏
-
- 文章 · 前端 | 1天前 |
- 表单 aria-describedby 关联错误提示的可访问设计
- 349浏览 收藏
-
- 文章 · 前端 | 1天前 | 前端 · css · 组合选择器 CSS :is specificity :where 级联层
- CSS :is 组合选择器时的 specificity 控制
- 327浏览 收藏
-
- 文章 · 前端 | 2天前 | javascript · DNS耗时 PerformanceResourceTiming TLS耗时
- PerformanceResourceTiming 拆分 DNS 与 TLS 耗时
- 108浏览 收藏
-
- 文章 · 前端 | 4天前 | 前端 · websocket ·
- WebSocket 重连退避与页面卸载的收尾
- 381浏览 收藏
-
- 文章 · 前端 | 4天前 |
- Fetch keepalive 处理页面卸载前的小请求
- 291浏览 收藏
-
- 文章 · 前端 | 4天前 |
- CSS @scope 限定组件样式作用域的迁移方法
- 294浏览 收藏
-
- 文章 · 前端 | 5天前 |
- View Transition API 在 SPA 状态切换中的降级方案
- 142浏览 收藏
-
- 文章 · 前端 | 5天前 | javascript · 表单 · FormData FormDataEvent formdata事件 原生表单
- FormDataEvent 统一拦截原生表单数据的实现
- 288浏览 收藏
-
- 文章 · 前端 | 5天前 | html · javascript · 表单 · requestSubmit form.submit HTML表单校验
- requestSubmit 与 form.submit 有什么区别
- 392浏览 收藏
-
- 文章 · 前端 | 5天前 |
- scheduler.yield 怎么把长任务拆开又保持优先级
- 110浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- PubMedQA
- 深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
- 318次使用
-
- H2O EvalGPT
- H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
- 374次使用
-
- LMArena
- LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
- 371次使用
-
- HELM
- 深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
- 337次使用
-
- MMBench
- MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
- 162次使用
-
- JavaScript函数定义及示例详解
- 2025-05-11 502浏览
-
- 智能体安全引领产业升级——国内AI安全产品市场深度分析
- 2026-08-21 501浏览
-
- CSS变量简化按钮悬停效果技巧
- 2026-05-31 501浏览
-
- JavaScript符号类型详解与应用
- 2026-05-31 501浏览
-
- HTML剪贴板复制粘贴怎么用
- 2026-05-26 501浏览

