Spring Boot + Vue 前后端分离项目解决跨域问题详解

Spring Boot + Vue 前后端分离项目解决跨域问题详解

在进行前后端分离开发时,跨域问题(CORS, Cross-Origin Resource Sharing)几乎是每个开发者都必须面对的挑战。本文将基于 Spring Boot + Vue 项目,详解如何优雅地解决跨域问题,并介绍几种常见方案及其适用场景。


一、什么是跨域问题?

跨域问题本质是浏览器的同源策略(Same-Origin Policy)限制了前端对不同源(协议、域名、端口)服务器的请求。

举例说明:

前端运行在 http://localhost:8080,而后端运行在 http://localhost:8081,两者的端口不同,属于"跨域"。


二、跨域的典型表现

当前端请求后端接口时,控制台报错类似如下:

java 复制代码
Access to XMLHttpRequest at 'http://localhost:8081/api/data' from origin 'http://localhost:8080' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

三、Spring Boot 跨域解决方案

方法一:使用 @CrossOrigin 注解(推荐用于开发调试)

java 复制代码
@RestController
@RequestMapping("/api")
@CrossOrigin(origins = "*") // 允许所有来源跨域
public class TestController {

    @GetMapping("/hello")
    public String sayHello() {
        return "Hello from backend!";
    }
}

你可以根据需要设置更严格的来源控制:

java 复制代码
@CrossOrigin(origins = "http://localhost:8080")

缺点:需要对每个 Controller 或方法添加注解,维护成本高。


方法二:全局 CORS 配置(推荐生产使用)

java 复制代码
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 implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("*")
                .allowedMethods("GET", "HEAD", "POST", "PUT", "DELETE", "OPTIONS")
                .maxAge(3600)
                .allowedHeaders("*");
    }
}

优点:统一配置,适用于大型项目和生产环境。


方法三:使用自定义 Filter(可选方案)

java 复制代码
@Component
public class CorsFilter implements Filter {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {

        HttpServletResponse res = (HttpServletResponse) response;
        HttpServletRequest req = (HttpServletRequest) request;

        res.setHeader("Access-Control-Allow-Origin", req.getHeader("Origin"));
        res.setHeader("Access-Control-Allow-Methods", "GET,POST,PUT,DELETE,OPTIONS");
        res.setHeader("Access-Control-Allow-Headers", "*");
        res.setHeader("Access-Control-Allow-Credentials", "true");

        if ("OPTIONS".equalsIgnoreCase(req.getMethod())) {
            res.setStatus(HttpServletResponse.SC_OK);
        } else {
            chain.doFilter(request, response);
        }
    }
}

四、Vue 前端配置(开发环境)

Vue CLI 提供了 vue.config.js 来配置代理:

js 复制代码
// vue.config.js
module.exports = {
  devServer: {
    proxy: {
      '/api': {
        target: 'http://localhost:8081', // 后端服务地址
        changeOrigin: true,
        pathRewrite: {
          '^/api': ''
        }
      }
    }
  }
}

请求示例:

js 复制代码
axios.get('/api/hello').then(res => {
  console.log(res.data);
});
相关推荐
上官浩仁15 小时前
springboot redisson 缓存入门与实战
spring boot·redis·缓存
小小工匠15 小时前
SpringBoot - Spring 资源加载全解析:ResourceLoader 与 ResourceUtils 的正确打开方式
spring boot·spring·resourceloader·resourcutils
半花16 小时前
【Vue】defineProps、defineEmits 和 defineExpose
前端·vue.js
我的名字帅不帅16 小时前
使用 Element UI -Container 布局容器时监听屏幕滚动无效
vue.js
用户280038329084016 小时前
升级Vue3.4+版本,ant-design-vue 3.x 版本的Modal函数方式无法关闭问题
vue.js
小菜全17 小时前
uniapp新增页面及跳转配置方法
开发语言·前端·javascript·vue.js·前端框架
老青蛙17 小时前
权限系统设计-用户设计
后端
echoyu.17 小时前
消息队列-初识kafka
java·分布式·后端·spring cloud·中间件·架构·kafka
little_xianzhong17 小时前
关于对逾期提醒的定时任务~改进完善
java·数据库·spring boot·spring·mybatis
yuluo_YX17 小时前
Go Style 代码风格规范
开发语言·后端·golang