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

前端笔记:同源策略、跨域问题

只有前端才会有跨域问题后端不受限制

一、什么是“同源策略”(Same-Origin Policy)

✅ 定义:

浏览器的 同源策略 是一种 安全机制限制一个源的 JavaScript 访问另一个源的资源,以防止恶意网站窃取用户敏感信息。

✅ “同源” 的判断标准(协议 + 域名 + 端口)必须都相同:

条件是否同源
http://a.com 与 http://a.com✅ 是同源
http://a.com 与 https://a.com❌ 协议不同
http://a.com 与 http://b.com❌ 域名不同
http://a.com:8080 与 http://a.com:8081❌ 端口不同


二、什么是“跨域”

跨域(Cross-Origin) 指的是前端 JavaScript 在浏览器中访问“非同源”的接口资源。

举例:

假设你的前端页面地址是:

http://localhost:8080

而你访问的后端接口是:

http://localhost:8081/api/user

因为 端口不同,所以就是跨域请求,浏览器就会限制 JS 获取响应内容。


三、同源策略限制什么?

操作类型是否受同源策略限制
<img src=""> 加载图片❌ 不受限制(可跨域)
<link> 加载 CSS❌ 不受限制(可跨域)
<script> 加载 JS❌ 不受限制(可跨域)
AJAX(XHR、fetch)请求接口✅ 受限制(必须同源)
页面间的 Cookie 共享✅ 受限制(必须同源)
iframe 操作其它页面 DOM✅ 受限制(必须同源)


四、为什么存在同源策略?

为了解决以下安全问题:

  • 防止 A 网站通过 JS 恶意读取 B 网站的用户信息(如 Cookie、localStorage、接口返回数据)

  • 避免 CSRF 攻击等跨站请求攻击

  • 浏览器不限制,用户信息可能被任意网站窃取


五、跨域请求报错长这样

Access to XMLHttpRequest at 'http://localhost:8081/api/user' 
from origin 'http://localhost:8080' has been blocked by CORS policy:
No 'Access-Control-Allow-Origin' header is present on the requested resource.

六、跨域的常见解决方案

✅ 方式一:服务端配置 CORS(推荐方式)

什么是 CORS?

CORS(Cross-Origin Resource Sharing)是浏览器与服务端约定的 跨域资源共享协议

不允许不是浏览器的一种安全限制么?为啥要后端配置允许跨域(CORS)?

🌐 浏览器的跨域请求是否被允许,是浏览器根据后端响应头是否包含 CORS 信息来决定的!

换句话说:

  • 不是浏览器自己说了算。

  • 是浏览器问后端:“你同不同意这个域名访问你?”

  • 如果后端没明确说“我允许”,那浏览器就拦截响应,不让 JS 拿到。

原理:
  • 浏览器在跨域请求时,会自动带上 Origin 请求头

  • 服务端需要在响应头中明确允许的来源:

Access-Control-Allow-Origin: http://localhost:8080
  • 浏览器收到后,才会允许 JavaScript 读取响应

Spring Boot 中配置 CORS:
@Configuration
public class CorsConfig implements WebMvcConfigurer {@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/**") // 允许所有路径.allowedOrigins("http://localhost:8080") // 允许访问的域.allowedMethods("GET", "POST", "PUT", "DELETE").allowCredentials(true); // 允许携带 Cookie}
}

✅ 方式二:前端开发时使用代理(只适合开发环境)

  • Vue/React 项目中,前端配置 devServer.proxy,把请求“伪装”转发到后端

// vue.config.js
module.exports = {devServer: {proxy: {'/api': {target: 'http://localhost:8081',changeOrigin: true}}}
}

✅ 方式三:JSONP(只能用 GET,已淘汰)

  • 原理:利用 <script src=""> 不受同源策略限制,将数据包成 JS 函数调用

  • 只能解决 GET 请求

  • 安全性差,功能弱,几乎淘汰


七、注意:跨域问题是浏览器行为,服务端或后端代码无此限制

场景是否受同源策略限制
浏览器 + JS + Ajax✅ 限制
后端发 Http 请求❌ 不限制
Postman 发请求❌ 不限制
curl 命令❌ 不限制


八、CORS 的核心意义总结一句话:

🌐 同源策略是浏览器为安全设定的限制机制,CORS 是服务端响应中声明“我允许谁来访问我”的机制。

如果服务端不显式声明允许,浏览器就自动屏蔽响应结果。


九、Vue + SpringBoot 是否跨域?

是跨域的,典型表现:

Vue 地址Spring Boot 地址是否跨域
http://localhost:8080http://localhost:8081✅ 是
http://localhost:8080http://localhost:8080❌ 否
http://frontend.example.comhttp://api.example.com✅ 是
http://www.dtcms.com/a/295873.html

相关文章:

  • 重绘(Repaint)与重排(Reflow)
  • 【ECharts✨】解决Vue 中 v-show 导致组件 ECharts 样式异常问题
  • 简单Proxy使用
  • 【Newman+Jenkins】实施接口自动化测试
  • Python 使用环境下编译 FFmpeg 及 PyAV 源码(英特尔篇)
  • AIRIOT智慧选煤厂管理解决方案
  • HTTP性能优化实战:从协议到工具的全面加速指南
  • 【unity游戏开发入门到精通——组件篇】unity的粒子系统力场 (Particle System Force Field)实现如旋风、吸引力、风吹效果等
  • OpenCV(03)插值方法,边缘填充,透视变换,水印制作,噪点消除
  • Python中浅拷贝和深拷贝的理解
  • 力扣 hot100 Day54
  • mvn dependency:tree 使用详解?
  • Leetcode 07 java
  • 赋能决策与创新的数据引擎:数据分析平台的价值与未来
  • b-up:Enzo_mi:Transformer DETR系列
  • 10_Spring Boot 中的 @Scheduled 注解是单线程还是多线程?同步还是异步?
  • 基于深度学习的肺癌肿瘤细胞图像识别与分类系统
  • 技术赋能多元探索:我的技术成长与行业洞察
  • 解决 WSL 中无法访问 registry-1.docker.io/v2/,无法用 docker 拉取 image
  • 新能源电池厂自动化应用:Modbus TCP转DeviceNet实践
  • IDM下载失败全面排查指南
  • 医疗设备自动化升级:Modbus TCP与DeviceNet的协议协同实践
  • DPO:大语言模型偏好学习的高效方案
  • Python 程序设计讲义(15):Python 的数据运算——位运算
  • Opentrons 模块化平台与AI技术助力智能移液创新,赋能AAW™自动化工作站
  • 深入探索Amazon SQS:构建弹性微服务与无服务器应用的秘密武器
  • 如何在Ubuntu系统下创建桌面快捷方式
  • Vue 3 项目性能优化指南
  • rk3588开发板使用硬件编码处理视频
  • 如何在 Windows 上安装 MongoDB 及常见问题