Vue3 + Spring Boot 项目中跨域问题的排查与解决

前言

作为一名普通的程序开发者,日常开发中经常会遇到各种奇怪的问题。今天我来分享一个在 Vue3 和 Spring Boot 混合开发项目中遇到的真实跨域问题。这个问题看似简单,但实际排查过程却让我花了不少时间。本文将从问题现象、分析思路、排查步骤到最终解决方案,一步步还原整个调试过程。

问题现象

在我们团队的一个前后端分离项目中,前端使用的是 Vue3,后端是 Spring Boot。正常情况下,前端通过 axios 调用后端接口应该能成功获取数据。但在某次更新之后,发现某些接口调用失败,浏览器控制台提示如下错误:

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

起初我以为是后端配置出了问题,但查看了 Spring Boot 的相关配置,发现已经添加了 @CrossOrigin 注解,并且也设置了 spring.mvc.cors.allowed-origins。然而问题依旧存在,这就让人感到困惑了。

问题分析

首先,我回顾一下 Vue3 和 Spring Boot 的通信机制。前端通过 axios 发送请求,后端通过 Spring Boot 提供 REST 接口。跨域问题是由于浏览器的安全策略导致的,只有当后端返回的响应头中包含 Access-Control-Allow-Origin 字段时,浏览器才会允许该请求。

可能的原因包括:

  • 后端没有正确设置 CORS 配置
  • 前端请求的域名和后端配置的允许域名不一致
  • 请求方式或请求头不符合 CORS 规范
  • 使用了代理服务器,但未正确配置

排查步骤

1. 检查后端 CORS 配置

首先确认后端是否真的启用了 CORS 支持。我们在 Spring Boot 中通常有两种方式启用 CORS:

方式一:使用 @CrossOrigin 注解
@RestController
@RequestMapping("/api")
@CrossOrigin(origins = "http://localhost:8081")
public class DataController {
    @GetMapping("/data")
    public ResponseEntity<String> getData() {
        return ResponseEntity.ok("Hello from backend!");
    }
}
方式二:全局配置
@Configuration
@EnableWebMvc
public class CorsConfig implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/api/**")
                .allowedOrigins("http://localhost:8081")
                .allowedMethods("GET", "POST")
                .allowedHeaders("*")
                .exposedHeaders("Access-Control-Allow-Origin")
                .maxAge(3600)
                .allowCredentials(true);
    }
}

但即使这样,仍然无法解决问题,说明可能还有其他问题。

2. 使用 Postman 测试接口

为了排除前端问题,我尝试使用 Postman 直接访问后端接口,结果发现接口可以正常返回数据,说明后端逻辑没问题。这说明问题出在浏览器的 CORS 策略上。

3. 检查前端请求配置

在 Vue3 中,我们使用 axios 发送请求,代码如下:

import axios from 'axios';

const apiClient = axios.create({
    baseURL: 'http://api.example.com',
    timeout: 5000,
});

export default {
    async fetchData() {
        try {
            const response = await apiClient.get('/data');
            console.log(response.data);
        } catch (error) {
            console.error('Error fetching data:', error);
        }
    },
};

看起来没有问题,但问题还是存在。

4. 检查浏览器控制台输出

再次打开浏览器控制台,发现除了之前的错误信息外,还有一条额外的信息:

Request URL: http://api.example.com/data
Request Method: GET
Status Code: 200 OK
Remote Address: 127.0.0.1:8080
Referrer Policy: no-referrer-when-downgrade

但是,响应头中并没有 Access-Control-Allow-Origin 字段。这说明后端虽然配置了 CORS,但实际上没有生效。

5. 检查后端日志

查看 Spring Boot 应用的日志,发现确实有请求到达,但没有看到任何关于 CORS 的日志。这说明可能是 Spring Boot 的 CORS 配置没有被正确加载。

6. 检查 Spring Boot 的依赖和版本

发现我们的项目中使用的是 Spring Boot 2.6.x,而有些 CORS 相关的类在较新的版本中发生了变化。我们尝试升级到 Spring Boot 2.7.x,问题依然存在。

7. 检查是否使用了反向代理

我们项目中使用 Nginx 作为反向代理。检查 Nginx 配置文件,发现没有设置 Access-Control-Allow-Origin 头,因此导致浏览器认为请求被拦截。

8. 修改 Nginx 配置

在 Nginx 配置中添加以下内容:

location /api {
    proxy_pass http://localhost:8080;
    add_header 'Access-Control-Allow-Origin' '*';
    add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
    add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';
    add_header 'Access-Control-Max-Age' 1728000;
    add_header 'Content-Type' 'text/plain; charset=utf-8';
    add_header 'Content-Length' 0;
}

保存并重启 Nginx 后,问题终于也是完美解决

总结

这次跨域问题虽然看似简单,但排查过程却非常复杂。从后端配置到前端请求,再到反向代理的设置,每一个环节都可能成为问题的根源。通过逐步排查,最终找到了问题所在——Nginx 没有正确设置 CORS 头。

对于类似的问题,建议在开发过程中尽早测试接口,避免后期出现难以定位的问题。同时,合理配置反向代理也是确保前后端分离项目顺利运行的重要一步。

Delphi 12.3 作为一款面向 Windows 平台的集成开发环境,由 Embarcadero Technologies 负责其持续演进。该环境以 Object Pascal 语言为核心,并依托 Visual Component Library(VCL)框架,广泛应用于各类桌面软件、数据库系统及企业级解决方案的开发。在此生态中,Excel4Delphi 作为一个重要的社区开源项目,致力于搭建 Delphi Microsoft Excel 之间的高效桥梁,使开发者能够在自研程序中直接调用 Excel 的文档处理、工作表管理、单元格操作及宏执行等功能。 该项目以库文件组件包的形式提供,开发者将其集成至 Delphi 工程后,即可通过封装良好的接口实现对 Excel 的编程控制。具体功能涵盖创建编辑工作簿、格式化单元格、批量导入导出数据,乃至执行内置公式宏指令等高级操作。这一机制显著降低了在财务分析、报表自动生成、数据整理等场景中实现 Excel 功能集成的技术门槛,使开发者无需深入掌握 COM 编程或 Excel 底层 API 即可完成复杂任务。 使用 Excel4Delphi 需具备基础的 Delphi 编程知识,并对 Excel 对象模型有一定理解。实践中需注意不同 Excel 版本间的兼容性,并严格遵循项目文档进行环境配置依赖部署。此外,操作过程中应遵循文件访问的最佳实践,例如确保目标文件未被独占锁定,并实施完整的异常处理机制,以防数据损毁或程序意外中断。 该项目的持续维护依赖于 Delphi 开发者社区的集体贡献,通过定期更新以适配新版开发环境 Office 套件,并修复已发现的问题。对于需要深度融合 Excel 功能的 Delphi 应用而言,Excel4Delphi 提供了经过充分测试的可靠代码基础,使开发团队能更专注于业务逻辑用户体验的优化,从而提升整体开发效率软件质量。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值