CORS 入门笔记(前后端跨域)

很多刚学前后端的人:

第一次看到:

txt 复制代码
CORS error
跨域
Access-Control-Allow-Origin

都会特别懵。

甚至:

会感觉:

txt 复制代码
明明后端接口没问题
为什么前端请求失败?

其实:

问题不在后端逻辑。

而在:

txt 复制代码
浏览器安全机制

一、什么是 CORS

CORS:

全称:

txt 复制代码
Cross-Origin Resource Sharing

中文:

txt 复制代码
跨域资源共享

一句话:

txt 复制代码
浏览器允许不同网站之间互相请求数据的规则

二、为什么会有跨域

浏览器:

默认:

txt 复制代码
不允许不同源之间互相访问

这是:

txt 复制代码
浏览器的同源策略

三、什么是"同源"

必须:

这三个都一样:

txt 复制代码
协议
域名
端口

才叫:

txt 复制代码
同源

四、举例(重点)


这个算同源

txt 复制代码
http://localhost:3000
http://localhost:3000

这个不算

端口不同:

txt 复制代码
http://localhost:3000
http://localhost:8080

这个也不算

协议不同:

txt 复制代码
http://example.com
https://example.com

这个也不算

域名不同:

txt 复制代码
http://a.com
http://b.com

五、为什么浏览器要限制

因为:

如果不限制:

恶意网站:

可能:

txt 复制代码
偷偷请求你的银行接口

非常危险。


六、最经典跨域场景

前端:

运行:

txt 复制代码
http://localhost:5173

Vue/React 开发服务器。


后端

Gin:

运行:

txt 复制代码
http://localhost:8080

前端请求后端

js 复制代码
fetch("http://localhost:8080/user")

七、结果

浏览器:

直接报错:

txt 复制代码
CORS error

八、为什么 Postman 没问题

很多新人:

这里会懵。


Postman

不是浏览器。

没有:

txt 复制代码
同源策略

所以:

txt 复制代码
不会拦截

九、真正拦截的是谁

不是:

txt 复制代码
Gin

也不是:

txt 复制代码
Go

而是:

txt 复制代码
浏览器

十、CORS 本质是什么

本质:

就是:

txt 复制代码
后端告诉浏览器:
"我允许你跨域访问"

十一、浏览器怎么知道允不允许

因为:

后端:

会返回:

txt 复制代码
响应头(Header)

十二、最重要响应头(必须记住)

txt 复制代码
Access-Control-Allow-Origin

十三、什么意思

例如:

txt 复制代码
Access-Control-Allow-Origin: *

表示:

txt 复制代码
允许所有网站访问

十四、Gin 如何解决 CORS

最简单:

使用中间件。


十五、安装 cors 中间件

bash 复制代码
go get github.com/gin-contrib/cors

十六、最简单写法(重点)

go 复制代码
package main

import (
	"github.com/gin-contrib/cors"
	"github.com/gin-gonic/gin"
)

func main() {

	r := gin.Default()

	// 开启 CORS
	r.Use(cors.Default())

	r.GET("/hello", func(c *gin.Context) {
		c.JSON(200, gin.H{
			"msg": "hello",
		})
	})

	r.Run(":8080")
}

十七、这里到底发生了什么

go 复制代码
r.Use(cors.Default())

会自动:

给响应头加:

txt 复制代码
Access-Control-Allow-Origin: *

于是:

浏览器:

发现:

txt 复制代码
后端允许跨域

就不会拦截。


十八、完整请求流程(重点)

txt 复制代码
前端 fetch
↓
浏览器发现跨域
↓
发送请求
↓
Gin 返回 Header
↓
Access-Control-Allow-Origin
↓
浏览器检查
↓
允许访问

十九、前端为什么能收到数据了

因为:

浏览器:

看到:

txt 复制代码
后端允许跨域

所以:

不再阻止。


二十、CORS 是浏览器安全机制

一定记住:

txt 复制代码
CORS 不是 Go 的规则
不是 Gin 的规则
不是 HTTP 的规则

它是:

txt 复制代码
浏览器安全规则

二十一、什么是预检请求(重点)

很多时候:

你会发现:

txt 复制代码
明明只发了一次请求
为什么后端收到两次?

这就是:

txt 复制代码
预检请求(OPTIONS)

二十二、什么时候会触发预检

例如:

txt 复制代码
PUT
DELETE
Authorization
application/json

这些:

可能触发:

txt 复制代码
OPTIONS 请求

二十三、浏览器为什么要预检

浏览器:

会先问:

txt 复制代码
"后端允许吗?"

二十四、流程图(重点)

txt 复制代码
浏览器
↓
先发 OPTIONS
↓
后端返回允许
↓
浏览器再发真正请求

二十五、为什么后端必须处理 OPTIONS

否则:

浏览器:

会认为:

txt 复制代码
不允许跨域

二十六、cors.Default() 帮你做了什么

它会自动:


1. 处理 OPTIONS


2. 添加允许跨域 Header


3. 设置默认规则

所以:

非常方便。


二十七、自定义 CORS(重点)

真实项目:

一般:

不会:

txt 复制代码
允许所有网站

二十八、自定义允许域名

go 复制代码
r.Use(cors.New(cors.Config{
	AllowOrigins: []string{
		"http://localhost:5173",
	},
	AllowMethods: []string{
		"GET", "POST", "PUT", "DELETE",
	},
	AllowHeaders: []string{
		"Origin", "Content-Type", "Authorization",
	},
}))

二十九、AllowOrigins

表示:

txt 复制代码
允许哪些前端访问

三十、AllowMethods

允许:

哪些 HTTP 方法。


三十一、AllowHeaders

允许:

哪些请求头。

例如:

txt 复制代码
Authorization

JWT 登录:

经常会用。


三十二、JWT 为什么经常触发 CORS

因为:

JWT:

通常:

会带:

txt 复制代码
Authorization

请求头。

于是:

浏览器:

会触发:

txt 复制代码
预检 OPTIONS

三十三、为什么真实项目一定要配 CORS

因为:

前后端:

几乎:

都是分离的。


前端

txt 复制代码
localhost:5173

后端

txt 复制代码
localhost:8080

天然跨域。


三十四、最经典错误


1. 后端没开 CORS

浏览器直接拦截。


2. OPTIONS 没处理

预检失败。


3. Authorization 没允许

JWT 请求失败。


三十五、最后一句总结(必须记住)

CORS 本质:

txt 复制代码
浏览器的跨域安全机制

核心思想:

txt 复制代码
后端通过 Header 告诉浏览器:
"我允许你访问"

Gin 最简单解决方案:

go 复制代码
r.Use(cors.Default())

真正核心流程:

txt 复制代码
前端请求
↓
浏览器检查是否跨域
↓
后端返回允许跨域 Header
↓
浏览器决定是否放行
相关推荐
闪闪发亮的小星星3 天前
高斯光以及高斯光公式解释
笔记
cqbzcsq3 天前
CellFlow虚拟细胞论文阅读
论文阅读·人工智能·笔记·学习·生物信息
阿米亚波3 天前
【Windows】QEMU 启动 openEuler aarch64/arm64 架构系统 + 离线软件源
linux·windows·经验分享·笔记·架构·arm
自传.3 天前
尚硅谷 Vibe Coding|第三章(1) Claude Code深度使用与进阶技巧 学习笔记
笔记·学习·尚硅谷·vibecoding
.千余3 天前
【C++】模板进阶全解:非类型参数|全特化|偏特化|分离编译完全指南
开发语言·c++·笔记·学习·其他
自传.3 天前
尚硅谷 Vibe Coding|第二章 AI编程工具生态 学习笔记
笔记·学习·ai编程·尚硅谷·vibe coding
秋波。未央3 天前
Java Agent 开发 · Day 1 学习笔记(含作业完整标准答案)
java·笔记·学习
中屹指纹浏览器3 天前
2026指纹浏览器字体指纹、字体渲染偏差检测与全维度虚拟字体池搭建方案
经验分享·笔记
影寂ldy3 天前
WinForm PictureBox控件 + ImageList组件 完整笔记
开发语言·笔记·swift