同源策略是浏览器安全机制,拦响应而非请求;同源需协议、域名、端口三者完全一致;它限制JS读取跨域响应、Cookie等,但不限资源加载。

浏览器的同源策略不是 bug,是安全设计。它默认拦住的是“响应结果”,不是请求本身——你的 fetch 或 axios 请求照样发出去了,后端也正常处理并返回了数据,但浏览器在收到响应后,检查发现不符合同源规则,就把它“藏起来”不给 JavaScript 访问。这就是为什么 Postman 能通、控制台 Network 里能看到 200 响应,但代码里拿不到 response.data 的原因。
同源到底看哪三样?
只比三个东西:协议(http/https)、域名(含子域名)、端口。三者必须完全一致才算同源。差一个就不行。
- 协议不同:https://a.com 和 http://a.com → 跨域
- 域名不同:a.com 和 b.com,或 a.com 和 api.a.com(子域名≠主域名)→ 跨域
- 端口不同:localhost:5173(前端开发服务器)和 localhost:8000(后端 API)→ 跨域(即使都是 localhost)
它限制什么?又不拦什么?
同源策略管的是 JavaScript 脚本对资源的“读取和操作权”,不是网络层的访问权。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 被限制的:跨域读 Cookie / LocalStorage、跨域访问 iframe.contentWindow、用 XMLHttpRequest 或 fetch 获取响应体
-
不被限制的:
<img src="https://xxx.com/photo.jpg">可以加载,<script src="https://cdn.jsdelivr.net/npm/vue@3"></script>可以执行,<link href="https://fonts.googleapis.com/css">可以引入样式——但你不能用 JS 去读这张图的像素,也不能拿到 script 标签加载的 Vue 源码字符串
CORS 是怎么配合同源策略工作的?
CORS 不是绕过同源策略,而是“经浏览器同意后的特许通行”。它靠后端在响应头里加几个字段,告诉浏览器:“这个源来请求,我允许。”
立即学习“Java免费学习笔记(深入)”;
- 简单请求(如 GET/POST + 普通 header):浏览器自动加
Origin头,后端返回Access-Control-Allow-Origin: https://your-frontend.com,浏览器就放行响应 - 复杂请求(如 PUT、带 Authorization 头、Content-Type 是 application/json):浏览器先发一个 OPTIONS 预检请求,后端必须正确响应
Access-Control-Allow-Methods和Access-Control-Allow-Headers,浏览器才发真正的请求 - 注意:
credentials: true(比如要传 Cookie)时,Access-Control-Allow-Origin不能写*,必须指定具体源,否则浏览器直接拒绝
常见误解澄清
很多人以为“关掉浏览器跨域就能调试”,其实不行——Chrome 启动加 --disable-web-security 是危险且无效的调试方式,现代 Chrome 已基本屏蔽该参数;还有人觉得“Nginx 代理就是解决跨域”,其实它只是让前后端看起来同源(都走 nginx 域名),本质是规避了同源判定,并没改变 CORS 逻辑。

















