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

前后端分离项目如何解决跨域问题

在做前后端分离项目的时候,很多小伙伴第一次遇到跨域问题时都会一脸懵:明明接口在 Apifox 里可以调通,为什么前端一访问就报错?本文带你从零搞懂 跨域问题的原因常见的解决方案,让你不再被 CORS 卡住。


一、什么是跨域?

跨域指的是 浏览器 出于安全考虑,禁止网页向不同域名、端口或协议的服务器发起请求。

举个例子:

  • 前端页面运行在 http://localhost:5173

  • 后端接口运行在 http://localhost:8080

虽然它们都在本机,但端口号不同(5173 ≠ 8080),浏览器就认为是跨域了,所以会拦截请求。

常见报错:

Access to XMLHttpRequest at 'http://localhost:8080/depts' from origin 'http://localhost:5173' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present

这就是典型的 CORS(跨域资源共享)问题


二、为什么 Apifox 能调通?

因为 Apifox / Postman 直接向后端发请求,不受浏览器安全策略限制。只有浏览器里运行的前端代码才会触发 CORS 校验。

所以 后端必须明确告诉浏览器:我允许你访问


三、跨域的解决方案

跨域问题有三种常见解决办法:

1. 后端开启 CORS 支持(推荐)

在 Spring Boot 里加一个配置类,全局允许跨域:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration
public class CorsConfig {@Beanpublic WebMvcConfigurer corsConfigurer() {return new WebMvcConfigurer() {@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/**").allowedOriginPatterns("*").allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS").allowedHeaders("*").allowCredentials(true);}};}
}

这样浏览器就不会拦截请求了。

如果只想允许某个前端端口访问,也可以用:

.allowedOrigins("http://localhost:5173")

2. 在 Controller 局部开启跨域

如果不想全局放开,可以在 Controller 上加注解:

@CrossOrigin(origins = "http://localhost:5173")
@RestController
public class DeptController {// ...
}

3. 前端用代理转发请求(Vite / Vue 项目常用)

vite.config.js 配置:

server: {proxy: {'/api': {target: 'http://localhost:8080',changeOrigin: true,rewrite: (path) => path.replace(/^\/api/, '')}}
}

然后前端请求改为:

axios.get('/api/depts')

这样浏览器看到的请求还是 http://localhost:5173/api/depts,不会触发跨域,而 Vite 会帮你代理转发到后端。


四、总结

  • 跨域报错 = 浏览器拦截,不是接口有问题

  • 后端可以通过 全局 CORS 配置Controller 注解 放开跨域。

  • 前端也可以通过 Vite 代理 解决跨域。

建议新手直接用 方法一(全局配置 CORS)方法三(Vite 代理),简单高效。

这样,不管是前端跑在 5173,后端跑在 8080,都能愉快通信啦 🚀。


文章转载自:

http://IBwB0TK0.crsqs.cn
http://9kUUp030.crsqs.cn
http://dRDy7EIQ.crsqs.cn
http://14re0wJR.crsqs.cn
http://HMdV1s34.crsqs.cn
http://5q0MDrFq.crsqs.cn
http://1y81sbaI.crsqs.cn
http://JmMnmhGZ.crsqs.cn
http://ISNCy4Xd.crsqs.cn
http://VW1tySKT.crsqs.cn
http://OmoZ1XfP.crsqs.cn
http://xLtpBylz.crsqs.cn
http://kDCCojL8.crsqs.cn
http://x5IBlbGZ.crsqs.cn
http://bdUSxsJN.crsqs.cn
http://5dcPUPSI.crsqs.cn
http://iuoa5pEF.crsqs.cn
http://3ZBjxxbM.crsqs.cn
http://0O1i0e5Q.crsqs.cn
http://gf72LWxu.crsqs.cn
http://8P9XzioY.crsqs.cn
http://oGnMWCke.crsqs.cn
http://9Cb7dJZ8.crsqs.cn
http://ciGMRKF6.crsqs.cn
http://wraRkBNf.crsqs.cn
http://q86pFvLz.crsqs.cn
http://XGoe6Iqb.crsqs.cn
http://M1BTTfNA.crsqs.cn
http://8wageyIh.crsqs.cn
http://LwwWqWQ2.crsqs.cn
http://www.dtcms.com/a/383667.html

相关文章:

  • IDEA使用Maven和MyBatis简化数据库连接(实现篇)
  • 【Pywinauto库】12.2 pywinauto.element_info 后端内部实施模块
  • 正向代理与反向代理的异同
  • 从ENIAC到Linux:计算机技术与商业模式的协同演进——开源生态的崛起与重构
  • RTC驱动原理
  • MyBatis 的“魔法”:Mapper 接口是如何找到并执行 SQL 的?
  • 构建日志采集和分析平台
  • 《Unity+腾讯云TRTC故障排查指南:从日志盲区到线程死锁的全链路解析》
  • 笔记25.9.14(QueryWrapper,Builder ,Stream流处理,forEach)
  • 深入理解MySQL主从架构中的Seconds_Behind_Master指标
  • systemverilog如何解决不能使用变量索引来进行位选择的范围指定
  • 多语言编码Agent解决方案(1)-项目概述与架构
  • 【深度学习踩坑实录】从 Checkpoint 报错到 TrainingArguments 精通:QNLI 任务微调全流程复盘
  • 【愚公系列】《人工智能70年》019-语音识别的历史性突破(铲平技术高门槛)
  • webpack 配置文件中 mode 有哪些模式?
  • AI推理范式:从CoT到ReAct再到ToT的进化之路
  • webpack和Module Federation区别分析
  • Knockout.js Virtual Elements 详解
  • 【JavaSE五天速通|第三篇】常用API与日期类篇
  • JavaWeb-Session和ServletContext
  • HTML 编码规范
  • 深度学习(九):逻辑回归
  • 【LeetCode 每日一题】36. 有效的数独
  • 单表查询要点概述
  • 【Trans2025】计算机视觉|即插即用|WSC:即插即用!WSC模块,高光谱图像分类新SOTA!
  • Java面试小册(3)
  • 微服务项目测试接口一次成功一次失败解决办法
  • GPIO 之 EMIO 按键控制 LED 实验
  • centos安装 GNOME 桌面环境
  • 高并发投票功能设计