前后端分离项目中的跨域问题全解:以 Vue + Spring Boot 为例¶
约 823 个字 48 行代码 预计阅读时间 5 分钟
本文面向刚接触前后端分离开发的个人开发者,一篇文章了解跨域原理、开发解决方案与生产配置技巧.
一、什么是跨域?为什么会出现?¶
在前后端分离架构中,前端项目(如 Vue)和后端服务(如 Spring Boot)通常运行在不同端口,比如:
- 前端地址:
http://localhost:8080
- 后端地址:
http://localhost:8081
这两个端口不一致就构成了“跨域请求”。
浏览器的同源策略(Same-Origin Policy)¶
浏览器为了安全,只允许访问同协议、同域名、同端口的资源。否则就会阻止请求并抛出跨域错误。
例如:
在浏览器控制台中会看到报错:
Text Only
Access to XMLHttpRequest at 'http://localhost:8081/xxx' from origin 'http://localhost:8080' has been blocked by CORS policy
二、什么是 CORS?¶
**CORS(Cross-Origin Resource Sharing)**是浏览器与服务器之间的一种协议,允许浏览器向服务器发起跨域请求。它的核心是由后端服务器设置 HTTP 响应头,告诉浏览器:“这个请求我允许”。
三、Spring Boot 如何解决跨域问题¶
Spring Boot 提供了三种主流方式来开启 CORS 支持。
方法一:使用 @CrossOrigin
注解(适合个人快速开发)¶
Java
@CrossOrigin(origins = "http://localhost:8080")
@RestController
@RequestMapping("/api")
public class UserController {
@GetMapping("/users")
public List<User> getUsers() {
return userService.getAllUsers();
}
}
- 可作用于类或方法级别;
- 可指定允许的源、方法、是否允许携带 Cookie 等;
- 缺点是需要对每个接口单独配置,不适合大型项目。
方法二:全局配置 CORS(推荐企业项目)¶
对于接口较多或多人协作的项目,可以通过配置类统一管理跨域策略。
Java
@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**") // 所有接口
.allowedOrigins("http://localhost:8080")
.allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
.allowedHeaders("*")
.allowCredentials(true); // 允许携带 Cookie
}
}
🚨 注意事项:¶
- 如果允许携带 Cookie,则
allowedOrigins
不可为"*"
,必须指定具体来源; - OPTIONS 请求是浏览器的“预检请求”,务必放行。
四、Vue 前端如何适配跨域¶
开发阶段推荐使用 vue.config.js
配置代理¶
创建或修改 vue.config.js
文件:
JavaScript
module.exports = {
devServer: {
proxy: {
'/api': {
target: 'http://localhost:8081', // Spring Boot 地址
changeOrigin: true,
pathRewrite: { '^/api': '' }
}
}
}
}
这样就可以在前端代码中发请求时只写 /api
前缀,而不涉及跨域:
Tip:代理只在开发环境有效,打包后不会生效。
五、生产环境怎么做?用 Nginx 反向代理!¶
上线部署后,通常不建议在服务端启用跨域,而是通过 Nginx 来统一转发请求,避免跨域。
示例 Nginx 配置(前端 Vue + 后端 Spring Boot)¶
Nginx Configuration File
server {
listen 80;
server_name yourdomain.com;
location / {
root /usr/share/nginx/html/; # Vue build 目录
index index.html;
try_files $uri $uri/ /index.html;
}
location /api/ {
proxy_pass http://localhost:8081/;
proxy_set_header Host $host;
}
}
这样,所有 /api
开头的请求都会由 Nginx 转发到 Spring Boot,浏览器不会感知到跨域,前后端就可以愉快协作啦!
六、其他实用建议¶
- 如果涉及认证(如 JWT / Cookie),需设置
withCredentials: true
,并确保后端也允许携带凭据; - 建议为不同环境(开发、测试、生产)设置不同的配置文件;
- 跨域仅存在于浏览器环境中,Postman、curl 是没有跨域限制的。
七、总结:开发者应该如何选择方案?¶
场景 | 推荐方式 |
---|---|
本地开发 | Vue 代理 + Spring CORS 注解或全局配置 |
项目上线部署 | 使用 Nginx 做反向代理 |
微服务架构 | 使用 Spring Cloud Gateway 配置 CORS |
写在最后¶
跨域问题看似麻烦,其实本质只是浏览器的安全机制。掌握了 CORS 的本质与前后端配合技巧,便可轻松解决这个问题。