当前位置: 首页 > news >正文

跨域中间件通俗理解

import ("github.com/gin-gonic/gin""net/http"
)// Cors 跨域处理
func Cors() gin.HandlerFunc {return func(c *gin.Context) {method := c.Request.Methodc.Header("Access-Control-Allow-Origin", "*")c.Header("Access-Control-Allow-Headers", "Content-Type,AccessToken,X-CSRF-Token, Authorization, Token")c.Header("Access-Control-Allow-Methods", "POST, GET, OPTIONS")c.Header("Access-Control-Expose-Headers", "Content-Length, Access-Control-Allow-Origin, Access-Control-Allow-Headers, Content-Type")c.Header("Access-Control-Allow-Credentials", "true")// 放行所有OPTIONS方法if method == "OPTIONS" {c.AbortWithStatus(http.StatusNoContent)}// 处理请求c.Next()}
}

场景:小明家和保安大叔

想象一下:

  • 你的后端服务器:就是 小明家
  • 你的前端应用:是一个住在隔壁小区的 快递员
  • 浏览器(同源策略):是小明家小区门口非常负责任的 保安大叔

正常情况(同源)

如果小明自己点外卖,外卖员是小明小区的(比如小区里的便利店),保安大叔一看是自己人,直接放行。这就是同源,不需要复杂的检查。

跨域情况(不同源)

现在,那个隔壁小区的快递员(前端)要给小明家送一个包裹(API 请求)。

  1. 快递员来到门口:快递员到达小明家小区门口,被保安大叔(浏览器)拦下。
  2. 保安大叔的规则(同源策略):保安大叔的规定是:“不是我们小区的,一律不准进!” 这就是浏览器的同源策略,天生就不信任外来人员。

这时,快递员(前端)就懵了,包裹送不进去。

“预检请求”(OPTIONS)

快递员很聪明,他不对保安大叔说“我要进去”,而是先问:

  • 快递员(浏览器发送 OPTIONS 请求):“大叔,我不是来硬闯的。我就是想问问,我带着一个‘蓝色大包裹’(Content-Type: application/json),想用‘手推车’(POST 方法)送进去,你们家小明允许吗?”

这就是预检请求 (Preflight Request)。它不是真的在送东西,而是在投石问路。

Cors 中间件的作用

你的 Cors 中间件,就好比是小明提前给保安大叔写的一张“授权通知单”。这张通知单贴在了门卫室。

现在,我们来看看 middleware/cors.go 里的代码是怎么变成这张通知单的:

  • c.Header("Access-Control-Allow-Origin", "*")

    • 通知单内容:“允许 所有小区 的快递员给我家送东西。”
    • 通俗解释:告诉保安大叔,别管快递员是哪个小区的,都放行。
  • c.Header("Access-Control-Allow-Methods", "POST, GET, OPTIONS")

    • 通知单内容:“允许快递员用 手推车(POST)步行(GET) 或者只是 在门口问问(OPTIONS) 的方式送货。”
    • 通俗解释:告诉保安大叔,快递员用这几种方式送货都是可以的。
  • c.Header("Access-Control-Allow-Headers", "...")

    • 通知单内容:“允许快递员的包裹上贴有 ‘加急’(Authorization)‘易碎’(Content-Type) 等特殊标签。”
    • 通俗解释:告诉保安大叔,看到这些特殊标记的包裹,也是允许的。
  • if method == "OPTIONS" { c.AbortWithStatus(http.StatusNoContent) }

    • 保安大叔的行动:当保安大叔看到快递员只是在门口问问话(OPTIONS 请求),他会查阅墙上的“授权通知单”,然后对快递员挥挥手说:“问清楚了,没问题,你可以按你说的送了!” 然后就完事了。他不会再给小明打电话确认,因为通知单上写得很清楚了。这就直接结束了这次“询问”,效率很高。
  • c.Next()

    • 保安大叔的行动:当一个真正的包裹(比如一个 POST 请求)来了,保安大叔检查完通知单,确认一切符合规定后,就会打开大门,说:“进去吧!”。然后快递员才能继续往小明家走。c.Next() 就是“打开大门”这个动作,让请求能继续前进。

总结一下

为什么需要 Cors 函数?

因为你家小区的保安大叔(浏览器) 太负责了,默认不让任何外人进。你必须写一张授权通知单(Cors 中间件) 贴在门卫室,清楚地告诉保安大叔,什么样的外来人员(哪个前端地址)、用什么样的方式(POST/GET)、携带什么样的东西(请求头),是可以放行的。

没有这张通知单,所有来自外部的请求都会被保安大叔拒之门外。有了它,跨小区的合作才能顺利进行。

http://www.lryc.cn/news/586936.html

相关文章:

  • 【QT】使用QSS进行界面美化
  • 005_提示工程与工具使用
  • 用Python实现一个Windows计算器练习
  • 011_视觉能力与图像处理
  • sklearn study notes[1]
  • Linux内核高效之道:Slab分配器与task_struct缓存管理
  • 基于Leaflet调用天地图在线API的多层级地名检索实战
  • Matlab批量转换1km降水数据为tiff格式
  • Java性能优化权威指南-JVM概述和监控调优
  • [特殊字符] Python自动化办公 | 3步实现Excel数据清洗与可视化,效率提升300%
  • 技术实现、行业变革及可视化呈现角度,系统性解析AI技术(特别是模型训练平台)
  • C++每日刷题day2025.7.13
  • 查看ubuntu磁盘占用方法
  • 日记-生活随想
  • 单例模式:确保全局唯一实例
  • 芯片相关必备
  • 第三章-提示词-解锁Prompt提示词工程核销逻辑,开启高效AI交互(10/36)
  • 如何成为 PostgreSQL 中级专家
  • 图形处理算法分类、应用场景及技术解析
  • Web应用性能优化之数据库查询实战指南
  • C/C++数据结构之多维数组
  • MySQL实操:将Word表格数据导入MySQL表
  • 导入 SciPy 的 io 模块
  • 基于Springboot+UniApp+Ai实现模拟面试小工具三:后端项目基础框架搭建上
  • 在人工智能自动化编程时代:AI驱动开发和传统软件开发的分析对比
  • ECU(电子控制单元)是什么?
  • Hashtable 与 HashMap 的区别笔记
  • LeetCode|Day9|976. 三角形的最大周长|Python刷题笔记
  • 代码部落 20250629 CSP-S复赛 模拟赛
  • 代码随想录算法训练营第十八天