前端/后端-配置跨域

1. 什么是跨域

协议(http /https)、域名(localhost / www.xxx.com)、端口(5173 / 3000 / 80)只要有一个不一样,就是跨域!

2. 浏览器为什么要禁止跨域?

假设你登录了 淘宝,cookie 存在浏览器。此时你打开一个 恶意网站

恶意网站想:我直接发请求到 taobao.com/pay 转账!

如果没有跨域限制

  • 浏览器会自动带上淘宝的 cookie
  • 恶意网站就能偷偷转走你的钱

浏览器为了阻止这种事,规定:

只有淘宝自己的页面,才能请求淘宝接口!

别的网站一律禁止!

这就是:同源策略

3. 为什么你本地开发会跨域?

  • 前端跑在 5173
  • 后端跑在 3000

在浏览器眼里:这是两个不同的 "网站"!

4. 前端设置跨域

vite.config.js

javascript 复制代码
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'

export default defineConfig({
  plugins: [vue()], // 必须有
  server: {
    proxy: {
      '/api': {
        target: 'http://localhost:3000', // 转发到后端
        changeOrigin: true
      }
    }
  }
})

api.js

javascript 复制代码
import axios from 'axios'

// 创建 axios 实例
const service = axios.create({
  baseURL: '/api', //是为了触发代理!
  timeout: 10000
})

注:

只要前端 baseURL 带 /api,后端接口就必须带 /api!

前后路径必须完全一样,才能匹配上!

5. 后端设置跨域

1.下载依赖cors

javascript 复制代码
npm install cors
  1. 如:在server.js里面加入一下两行代码
javascript 复制代码
const express = require('express');
const app = express();

// 👇 就这两行,解决所有跨域!
const cors = require('cors');
app.use(cors());

3.运行代码

javascript 复制代码
node server.js

注:

后端配置跨域后,前端就不需要跨域了,把vite.config.js还原,api的baseUrl用后端服务地址就行。

javascript 复制代码
import axios from 'axios'

// 创建 axios 实例
const service = axios.create({
  baseURL: 'http://localhost:3000', //后端服务地址
  timeout: 10000
})

6. 前端跨域和后端跨域的区别

一、前端跨域 = 前端代理

就是:Vite / Webpack 帮你转发请求。

原理:

  1. 前端访问自己:/api/xxx

  2. Vite偷偷转发到后端

  3. 浏览器以为是同域,不拦截

特点:

  • 只在本地开发有用

  • 上线后失效

  • 必须加前缀 /api 来触发转发

  • 后端接口必须对应 /api

  • 不适合图片、文件上传(容易坏)

  • 本质:绕开浏览器限制,不是真正解决

二、后端跨域 = CORS

就是:后端告诉浏览器:允许前端访问我

原理:

后端在响应头里加一句:"我允许这个前端调用我"浏览器看到就放行。

特点:

  • 开发、生产环境都能用

  • 真正、标准、官方的跨域方案

  • 前端不用加 /api

  • 后端不用加 /api

  • 完美支持图片、文件上传

  • 本质:真正解决跨域

相关推荐
benbenAItalk2 小时前
数字人口播视频的批量生产实践:素材规范、任务编排与质量验收
java·前端·音视频
2601_962885722 小时前
如何用 Python 扫描 A 股跳空缺口并统计缺口回补概率?
java·前端·python
西瓜太郎12343 小时前
Claude Code、Codex CLI、Gemini CLI 能否共用一枚 Key?先看协议选择矩阵
前端·api 网关·claude code·gemini cli·codex cli
多加点辣也没关系3 小时前
JavaScript|第31章:表单与控件
开发语言·javascript·ecmascript
陈随易5 小时前
在Finch用了62亿词元,我认为这是新一代Agent工具之神
前端·人工智能·后端
水域安全老周5 小时前
水趣钓鱼救生衣专利拆解:两级锁紧如何解决落水人衣分离
java·前端·网络
计算机魔术师6 小时前
Anthropic CEO突然喊踩刹车,OpenAI罕见力挺:AI这辆车不能只踩油门了
前端
wing986 小时前
从codex转战workbuddy使用一周的感受
前端·人工智能·后端
Highcharts.js6 小时前
常见报错排雷指南2:导出失败的官方解法
javascript·react.js·ecmascript·highcharts·可视化图表·导出模块失败·导出服务
EatFan6 小时前
Java接入支付宝 JSAPI 支付保姆教程(二):流程讲解与前后端代码讲解
前端·spring boot·后端·微信小程序·小程序·uni-app