• 设为首页
  • 收藏本站
  • 积分充值
  • VIP赞助
  • 手机版
  • 微博
  • 微信
    微信公众号 添加方式:
    1:搜索微信号(888888
    2:扫描左侧二维码
  • 快捷导航
    福建二哥 门户 查看主题

    Go 跨域中间件解决CORS问题

    发布者: 姬7089 | 发布时间: 2025-8-14 14:46| 查看数: 75| 评论数: 0|帖子模式

    在开发基于 Web 的 API 时,尤其是前后端分离项目,**跨域问题(CORS)**是前端开发人员经常遇到的“拦路虎”。本文将带你了解什么是跨域、如何在 Go 中优雅地实现一个跨域中间件,支持你自己的 HTTP 服务或框架如
    1. net/http
    复制代码
    1. Gin
    复制代码
    等。

    什么是跨域(CORS)?

    CORS(Cross-Origin Resource Sharing)是浏览器的一种安全策略,它阻止一个域上的网页向另一个域发起 AJAX 请求。比如,前端运行在
    1. http://localhost:3000
    复制代码
    ,后端运行在
    1. http://localhost:8080
    复制代码
    ,这就属于跨源请求。
    为了安全,浏览器默认禁止这种请求,除非后端服务器明确在响应头中声明:我允许这个请求通过

    Go 中如何处理跨域?

    在 Go 中,我们可以通过**中间件(middleware)**的方式拦截请求,并给响应头添加相关的 CORS 允许字段,从而让浏览器放心通信。

    一、原生 net/http 实现 CORS 中间件
    1. package main

    2. import (
    3.     "fmt"
    4.     "net/http"
    5. )

    6. func main() {
    7.     http.Handle("/", corsMiddleware(http.HandlerFunc(indexHandler)))
    8.     http.ListenAndServe(":8080", nil)
    9. }

    10. func indexHandler(w http.ResponseWriter, r *http.Request) {
    11.     fmt.Fprintln(w, "Hello from Go Backend")
    12. }

    13. func corsMiddleware(next http.Handler) http.Handler {
    14.     return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    15.         // 设置 CORS 响应头
    16.         w.Header().Set("Access-Control-Allow-Origin", "*") // 允许所有来源
    17.         w.Header().Set("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS")
    18.         w.Header().Set("Access-Control-Allow-Headers", "Content-Type, Authorization")

    19.         // 如果是预检请求,直接返回
    20.         if r.Method == "OPTIONS" {
    21.             w.WriteHeader(http.StatusNoContent)
    22.             return
    23.         }

    24.         // 继续处理请求
    25.         next.ServeHTTP(w, r)
    26.     })
    27. }
    复制代码
    1. 支持基本的 GET、POST 请求,并处理了浏览器的 <strong>预检请求(OPTIONS)</strong>。
    复制代码
    二、使用 Gin 框架的 CORS 中间件

    如果你使用的是 Gin 框架,可以使用官方推荐的
    1. github.com/gin-contrib/cors
    复制代码
    插件:

    安装依赖:
    1. go get github.com/gin-contrib/cors
    复制代码
    示例代码:
    1. package main

    2. import (
    3.     "github.com/gin-contrib/cors"
    4.     "github.com/gin-gonic/gin"
    5.     "time"
    6. )

    7. func main() {
    8.     r := gin.Default()

    9.     // 使用 cors 中间件
    10.     r.Use(cors.New(cors.Config{
    11.         AllowOrigins:     []string{"http://localhost:3000"}, // 只允许特定域名
    12.         AllowMethods:     []string{"GET", "POST", "PUT", "DELETE", "OPTIONS"},
    13.         AllowHeaders:     []string{"Origin", "Content-Type", "Authorization"},
    14.         ExposeHeaders:    []string{"Content-Length"},
    15.         AllowCredentials: true,
    16.         MaxAge:           12 * time.Hour,
    17.     }))

    18.     r.GET("/", func(c *gin.Context) {
    19.         c.JSON(200, gin.H{"message": "Hello from Gin!"})
    20.     })

    21.     r.Run(":8080")
    22. }
    复制代码
    1. 更灵活配置,可以设置特定来源、暴露字段、是否携带 cookie 等。
    复制代码
    小结

    方式特点
    原生
    1. net/http
    复制代码
    灵活轻便,但需要手动设置和维护响应头
    使用 Gin 插件配置方便,支持更多高级选项,如 credentials、缓存等

    跨域处理注意事项


    • 开发环境可以设置
      1. *
      复制代码
      允许所有源,但生产环境请限制具体域名,避免安全风险。
    • 前端使用
      1. fetch
      复制代码
      时,若要携带 Cookie,需要设置
      1. credentials: 'include'
      复制代码
      ,后端也要设置
      1. AllowCredentials: true
      复制代码

    • OPTIONS 请求是浏览器自动发送的预检请求,必须返回 200 或 204 状态码。

    写在最后

    在 Go 项目中实现 CORS 支持并不复杂,只要你理解了浏览器的跨域行为,就可以通过中间件轻松搞定。无论你是用标准库还是 Gin 框架,跨域问题都不再是“魔咒”。
    到此这篇关于Go 跨域中间件解决CORS问题的文章就介绍到这了,更多相关Go 跨域中间件 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    来源:互联网
    免责声明:如果侵犯了您的权益,请联系站长(1277306191@qq.com),我们会及时删除侵权内容,谢谢合作!

    最新评论

    QQ Archiver 手机版 小黑屋 福建二哥 ( 闽ICP备2022004717号|闽公网安备35052402000345号 )

    Powered by Discuz! X3.5 © 2001-2023

    快速回复 返回顶部 返回列表