在做前后端分离项目的时候,很多小伙伴第一次遇到跨域问题时都会一脸懵:明明接口在 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 {
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurer() {
@Override
public 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,都能愉快通信啦 🚀。