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

关于跨域和解决方案

跨域和代理

什么是跨域

是一种由浏览器强制实施的安全机制。
指浏览器出于安全考虑,限制网页脚本向不同源的服务器发起请求。
这是浏览器的同源策略导致的限制。

同源策略: 由协议+域名+端口号组成,要求三个完全相同

  • 协议:如 http 与 https 不同源。
  • 域名:如 example.com 与 api.example.com 不同源。
  • 端口:如 80 与 8080 不同源。

举例:
如果一个网页(来自 http://localhost:xxxx)试图向另一个域名(https://api-xxxx.com)发送请求,浏览器会先发一个 OPTIONS 请求(预检请求)询问服务器是否允许。

后端需要在它的响应头(Response Headers)中加入像 Access-Control-Allow-Origin: http://localhost:xxxx 这样的字段,告诉浏览器:“我允许来自这个前端的请求”。

跨域的常见场景

  • 前端域名 https://example.com 请求后端接口 https://api.example.com。
  • 本地开发时前端 http://localhost:3000 请求后端 http://localhost:8080
  • 使用 http 协议访问 https 接口。

跨域的解决方案

不管是运行在本地 / 测试 / 生产环境,都和后端接口的地址不同源,所以直接发送请求一定会跨域。
以下有不同的方案来解决跨域问题。

1、CORS(跨域资源共享)

后端通过设置响应头允许跨域请求,例如
在这里插入图片描述

在这里插入图片描述
请求:

使用绝对URl(直接请求后端)

// 在axios中直接使用完整URL
axios.get('https://api-xxxx/system/xxxx').then(response => {// 处理响应});

这么写的比较少,一般会做一些基础配置,然后使用相对路径

const api = axios.create({baseURL: 'https://api-xxxx.com', // 基础地址直接是后端timeout: 30000,
});// 使用相对路径,最后被发送到 https://api-xxxx.com/system/xxxx
axios.get('/system/xxxx').then(response => {// 处理响应});

流程:
虽然前端没有使用代理,但是

  1. 前端直接请求 https://api-xxxx.com/system/xxxx
  2. 浏览器识别到这是跨域请求,发送预检OPTIONS请求
  3. 后端正确配置了CORS
  4. 浏览器看到后端允许跨域,放行
2、JSONP

通过 script 标签绕过跨域限制,仅支持 GET 请求。
实际的vue项目中不会用这种方式

3、代理服务器

在开发工具(如 Vite、Webpack)中配置代理
告诉前端的开发服务器(如 Vite、Webpack):“所有以 /api 开头的请求,别直接发给我的后端,你先帮我转发一下”。

流程:

  1. 你在前端代码中写了一个相对路径的请求:axios.get(‘system/xxx’)
  2. 浏览器会认为这个请求是发给http://localhost:xxxx(当前前端页面所在的域名)的
  3. 但你在vite.config.js中配置了代理,vite开发服务器会拦截这个发给localhost的请求
  4. vite开发服务器会悄悄将这个请求转发到配置的后端目标地址
  5. 收到后端返回的数据后,vite再把它交给前端
  6. 对浏览器而言,它只知道它向localhost请求并收到了响应,完全没有触发跨域限制,因为对它来说,这是同源请求
// vite.config.js
server: {port: env.VITE_PORT, // 端口号host: "0.0.0.0",open: env.VITE_OPEN === 'true',proxy: {['/api']: {target: env.VITE_BASE_URL,changeOrigin: true,rewrite: (path) => path.replace(new RegExp(`^/admin-api`), ''),},},
},

生产环境注意: 这种代理只在开发环境(npm run dev)下有效,当你构建生产版本时,就失效了,需要直接请求后端API的绝对URL,或者配置生产环境的反向代理(比如Nginx)

http://www.dtcms.com/a/394889.html

相关文章:

  • 学习日报 20250921|LoadingCache
  • 聚力赋能|竹云受邀出席2025华为全联接大会
  • 抓取 Dump 文件与 WinDbg 使用详解:定位 Windows 程序异常的利器
  • 计算机组成原理:指令周期
  • 老题新解|简单算术表达式求值
  • RustFS与其他新兴存储系统(如SeaweedFS)相比有哪些优势和劣势?
  • WPS标点符号换行问题解决
  • 开发团队的文档自动化革命:WPS+cpolar实战录
  • 【Linux】文本编辑器Vim
  • flink1.18下游配置多个sink
  • 如何删除 MySQL 数据库中的所有数据表 ?
  • win10加域后,控制面板中的,internet 时间就没有了
  • Unity移动平台笔记
  • 【图像算法 - 27】基于YOLOv12与OpenCV的无人机智能检测系统
  • html css js网页制作成品——圣罗兰护肤html+css+js 4页附源码
  • 21届-3年-Java面经-华为od
  • 计算机视觉(opencv)实战三十一——CascadeClassifier 详解与实战人脸检测
  • 计算机视觉:基于YOLOv11 实例分割与OpenCV 在 Java 中的实现图像实例分割
  • 【实战】Spring Boot 3.x整合Redis:注解式缓存与分布式锁最佳实践
  • 密钥耳语-一个轻量、易备份、支持命令行与图形界面的口令派生加密工具 具有 CLI 和 GUI 的轻量级密码衍生加密工具
  • AI重塑流量背后,微软广告打造下一代广告生态
  • 低代码数字化时代的开发新范式
  • 微信小程序“无损去水印精灵”技术解析大纲
  • 少儿舞蹈小程序(18)订单确认
  • Uniapp X 打包抖音小程序教程
  • uni-app中实现在input的placeholder中添加图标
  • vue面试题集锦
  • 基于Springboot+UniApp+Ai实现模拟面试小工具十二:模拟面试功能实现
  • 基于Springboot+UniApp+Ai实现模拟面试小工具十一:主页功能及简历上传功能实现
  • BGP选路“十一步”法则