在前后端分离开发中,跨域是一个常见问题。跨域(CORS, Cross-Origin Resource Sharing)指的是浏览器出于安全考虑,阻止不同源(协议+域名+端口)之间的请求行为。本文介绍在 Vue 项目中如何解决跨域问题。

一、开发阶段跨域解决方式

1、前端通过 vue.config.js 配置代理

vue.config.js 中配置 devServer.proxy,将请求代理到后端地址:

module.exports = {
  devServer: {
    proxy: {
      '/api': {
        target: 'http://localhost:8080', // 后端服务地址
        changeOrigin: true,
        pathRewrite: { '^/api': '' }
      }
    }
  }
}

2、后端配置 CORS 跨域响应头

后端需添加允许跨域访问的响应头,常见设置如下:

Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS
Access-Control-Allow-Headers: Content-Type, Authorization

也可以使用后端框架自带的 CORS 中间件进行配置(如 Spring 的 @CrossOrigin 注解)。

二、部署阶段跨域解决方式

部署到生产环境后,推荐使用 Nginx 反向代理 来处理跨域问题。例如:

location /api/ {
    proxy_pass http://backend-server;
    add_header Access-Control-Allow-Origin *;
    add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
    add_header Access-Control-Allow-Headers 'Authorization,Content-Type';
}

三、浏览器预检请求(OPTIONS)

当发起非简单跨域请求时,浏览器会先发送一次 OPTIONS 请求(称为“预检请求”),确认服务器是否接受。

常见预检相关请求头

请求头

含义

Access-Control-Request-Method

实际请求将使用的 HTTP 方法(如 POST、PUT)

Access-Control-Request-Headers

实际请求中将携带的自定义头信息

服务端需要返回的响应头

响应头

含义

Access-Control-Allow-Origin

允许访问的源域名,

*

表示所有域名

Access-Control-Allow-Methods

允许的 HTTP 方法

Access-Control-Allow-Headers

允许的自定义请求头

Access-Control-Max-Age

预检请求结果在缓存中的有效时间(单位:秒)