Vue3 + Spring Boot前后端分离项目跨域问题完整解决方案

一、跨域问题本质

浏览器出于安全考虑执行的同源策略,当前端(http://localhost:8080)访问后端(http://localhost:8888)时,因协议、域名、端口任意一项不同即触发跨域限制,错误表现为:

Access to XMLHttpRequest at 'http://localhost:8888/api' from origin 'http://localhost:8080' has been blocked by CORS policy

二、开发环境解决方案

方案1:Vue3前端代理配置(推荐)

在开发环境中,通过前端脚手架工具代理请求模拟同源访问:

针对Vite项目 (vite.config.js):

<JAVASCRIPT>

export default defineConfig({
  server: {
    proxy: {
      '/api': {
        target: 'http://localhost:8888',  // Spring Boot后端地址
        changeOrigin: true,               // 虚拟托管
        rewrite: (path) => path.replace(/^\/api/, '') // 路径重写(可选)
      }
    }
  }
})
针对Vue CLI项目 (vue.config.js):

<JAVASCRIPT>

module.exports = {
  devServer: {
    proxy: {
      '/api': {
        target: 'http://localhost:8888',
        changeOrigin: true,
        pathRewrite: { '^/api': '' }
      }
    }
  }
}

调用示例

<JAVASCRIPT>

axios.get('/api/users')  // 实际代理到 http://localhost:8888/users

方案2:Spring Boot后端CORS配置

在Spring Boot中添加全局CORS配置,允许特定客户端访问:

<JAVA>

@Configuration
public class CorsConfig implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")  // 匹配所有路径
                .allowedOrigins("http://localhost:8080")  // Vue前端地址
                .allowedMethods("GET", "POST", "PUT", "DELETE")
                .allowedHeaders("*")
                .allowCredentials(true);  // 允许携带cookie
    }
}

注意:如使用Spring Security,需额外配置:

<JAVA>

@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.cors()  // 启用Spring Security CORS
            .and()
            // 其他安全配置...
    }
}

三、生产环境解决方案

生产环境不再使用本地代理,推荐通过统一部署域名 + Nginx反向代理解决跨域问题:

Nginx统一反向代理配置

<NGINX>

server {
    listen       80;
    server_name  your-domain.com;

    # 前端静态文件服务
    location / {
        root   /usr/share/nginx/html;
        index  index.html;
        try_files $uri $uri/ /index.html;  # 支持Vue Router history模式
    }

    # 后端接口代理转发
    location /api/ {
        proxy_pass  http://backend-server:8888/;  # 后端服务真实地址
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

此时前端和后端通过统一域名访问,规避跨域问题(如 https://your-domain.com)。


四、可选补充方案

1. Spring Boot单控制器CORS注解

<JAVA>

@RestController
@CrossOrigin(origins = "http://localhost:8080")  // 指定控制器允许的源
@RequestMapping("/api")
public class UserController {
    // 接口方法...
}
2. 自定义CORS过滤器

处理复杂场景(如动态校验Origin):

<JAVA>

@Component
public class CustomCorsFilter implements Filter {
    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) 
        throws IOException, ServletException {
        HttpServletResponse response = (HttpServletResponse) res;
        HttpServletRequest request = (HttpServletRequest) req;

        response.setHeader("Access-Control-Allow-Origin", "http://localhost:8080");
        response.setHeader("Access-Control-Allow-Methods", "GET,POST,PUT,DELETE");
        response.setHeader("Access-Control-Allow-Headers", "*");

        if ("OPTIONS".equalsIgnoreCase(request.getMethod())) {
            response.setStatus(HttpServletResponse.SC_OK);
            return;
        }

        chain.doFilter(req, res);
    }
}

五、验证与调试

  1. 浏览器F12检查请求头

    • 确认前端请求地址是否代理到正确后端地址
    • 检查OriginAccess-Control-Allow-Origin头是否匹配
  2. 跨域错误模拟工具

    <JAVASCRIPT>

    // 在前端直接请求后端地址(非代理方式)
    axios.get('http://localhost:8888/api/users').then(...)

    若配置成功应可正常响应,反之会触发跨域错误。

  3. 生产环境验证: 通过curl命令或Postman模拟跨域请求:

    curl -H "Origin: http://your-domain.com" -I http://api.your-domain.com/users
    

六、安全注意事项

  1. 避免使用通配符*:生产环境应限定具体的allowedOrigins
  2. 结合HTTPS:确保跨域请求通过加密传输
  3. 鉴权与CSRF保护:携带Cookie时需同步解决CSRF问题

通过上述配置,Vue3 + Spring Boot项目的跨域问题将在开发和生产环境中得到完整解决。

### VueSpring Boot 前后端分离配置教程 #### 1. 配置概述 前后端分离是一种现代化的 Web 开发模式,其中前端专注于用户界面和交互逻辑,而后端则负责提供 API 接口以及业务逻辑处理。Vue 是一种流行的前端框架,而 Spring Boot 则是一个强大的 Java 微服务框架。两者结合可以实现高效的 SPA(单页应用程序)开发。 --- #### 2. Spring Boot 后端配置 ##### 2.1 MyBatis 配置 在 `application.yml` 文件中添加 MyBatis 的相关配置,用于指定 Mapper XML 文件的位置以及实体类所在包路径: ```yaml mybatis: mapper-locations: classpath:mapper/*.xml # 映射器位置 type-aliases-package: com.example.demo.model # 实体类包名 ``` 此配置允许 Spring Boot 自动扫描并加载所有的 Mapper 文件[^4]。 ##### 2.2 JSON 时间格式化 对于数据库中的时间字段(如 `TIMESTAMP`),可以通过 `@JsonFormat` 注解对实体类的时间属性进行格式化。例如,在用户的生日字段中设置时间为 `"yyyy-MM-dd"` 格式: ```java package com.example.demo.model; import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; import java.util.Date; @Data public class User { private String id; private String name; @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") private Date birthDate; } ``` 以上代码片段展示了如何通过 Jackson 库自动解析日期字符串为标准格式[^4]。 --- #### 3. Vue 前端配置 ##### 3.1 安装 Axios Axios 是一个基于 Promise 的 HTTP 请求库,适合用来与后端 RESTful API 进行通信。安装命令如下: ```bash npm install axios --save ``` 随后可以在 Vue 组件中引入 Axios 并发起请求: ```javascript // main.js 或单独的服务模块 import axios from &#39;axios&#39;; const instance = axios.create({ baseURL: &#39;http://localhost:8080/api&#39;, // 设置后端接口的基础 URL timeout: 5000, // 超时时间 (毫秒) }); export default instance; ``` ##### 3.2 发起 GET 请求示例 以下是一段简单的 Vue 方法,展示如何调用后端获取用户列表数据: ```javascript methods: { async fetchUsers() { try { const response = await this.$axios.get(&#39;/users&#39;); console.log(response.data); // 打印返回的数据 } catch (error) { console.error(&#39;Error fetching users:&#39;, error); } }, }, mounted() { this.fetchUsers(); // 页面挂载完成后立即执行查询操作 } ``` 该方法会在组件初始化时向 `/api/users` 地址发送 GET 请求,并打印服务器返回的结果[^1]。 --- #### 4. CORS 配置 由于前后端运行于不同的名或端口号,默认情况下会触发问题。因此需要在 Spring Boot 中启用 CORS 支持。以下是全局配置方式: ```java @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") // 允许访问所有接口 .allowedOrigins("http://localhost:8081") // 允许来自特定前端地址的请求 .allowedMethods("GET", "POST", "PUT", "DELETE"); // 允许的方法类型 } } ``` 这样即可解决常见的资源共享限制问题[^3]。 --- #### 5. 总结 通过上述步骤,开发者可以完成基本的 VueSpring Boot 前后端分离项目的搭建工作。具体流程包括但不限于:MyBatis 数据映射、JSON 时间序列化、Axios 请求封装以及 CORS 解决方案等内容。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值