Go 跨域中间件解决CORS问题

 更新时间:2025年04月22日 10:47:50   作者:程序员爱钓鱼  
跨域问题CORS是前端开发人员经常遇到的问题,本文主要介绍了Go 跨域中间件解决CORS问题,具有一定的参考价值,感兴趣的可以了解一下

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

什么是跨域(CORS)?

CORS(Cross-Origin Resource Sharing)是浏览器的一种安全策略,它阻止一个域上的网页向另一个域发起 AJAX 请求。比如,前端运行在 http://localhost:3000,后端运行在 http://localhost:8080,这就属于跨源请求。

为了安全,浏览器默认禁止这种请求,除非后端服务器明确在响应头中声明:我允许这个请求通过

Go 中如何处理跨域?

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

一、原生 net/http 实现 CORS 中间件

package main

import (
    "fmt"
    "net/http"
)

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

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

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

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

        // 继续处理请求
        next.ServeHTTP(w, r)
    })
}

支持基本的 GET、POST 请求,并处理了浏览器的 预检请求(OPTIONS)

二、使用 Gin 框架的 CORS 中间件

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

安装依赖:

go get github.com/gin-contrib/cors

示例代码:

package main

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

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

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

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

    r.Run(":8080")
}

更灵活配置,可以设置特定来源、暴露字段、是否携带 cookie 等。

小结

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

跨域处理注意事项

  • 开发环境可以设置 * 允许所有源,但生产环境请限制具体域名,避免安全风险。
  • 前端使用 fetch 时,若要携带 Cookie,需要设置 credentials: 'include',后端也要设置 AllowCredentials: true
  • OPTIONS 请求是浏览器自动发送的预检请求,必须返回 200 或 204 状态码。

写在最后

在 Go 项目中实现 CORS 支持并不复杂,只要你理解了浏览器的跨域行为,就可以通过中间件轻松搞定。无论你是用标准库还是 Gin 框架,跨域问题都不再是“魔咒”。

到此这篇关于Go 跨域中间件解决CORS问题的文章就介绍到这了,更多相关Go 跨域中间件 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Golang 如何判断数组某个元素是否存在 (isset)

    Golang 如何判断数组某个元素是否存在 (isset)

    这篇文章主要介绍了Golang 如何判断数组某个元素是否存在 (isset),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • 如何避免Go语言常见错误之意外的变量隐藏

    如何避免Go语言常见错误之意外的变量隐藏

    在Go语言中,变量隐藏(Variable Shadowing)是一个常见的错误来源,变量隐藏发生在一个内部作用域中声明的变量与外部作用域的变量同名时,这可能导致开发者无意中使用了错误的变量,造成难以追踪的bug,本文讲解一些关于变量隐藏的常见错误和如何避免它们的方法
    2024-01-01
  • 在Go中编写测试代码的方法总结

    在Go中编写测试代码的方法总结

    在程序开发过程中,测试是非常重要的一环,甚至有一种开发模式叫 TDD,先编写测试,再编写功能代码,通过测试来推动整个开发的进行,可见测试在开发中的重要程度,为此,Go提供了testing框架来方便我们编写测试,本文将向大家介绍在Go中如何编写测试代码
    2023-07-07
  • 详细介绍Go语言之数组与切片

    详细介绍Go语言之数组与切片

    这篇文章介绍Go语言之数组与切片,数组是具有相同唯一类型的一组已编号且长度固定的数据项序列,这种类型可是任意的原始类型如整形、字符串或自定义类型。切片是数组的一个引用,因此切片是引用类型,在进行传递时,遵守引用传递的机制,下面我们就来详细了解一下该内容
    2021-10-10
  • Golang HTTP请求Json响应解析方法以及解读失败的原因

    Golang HTTP请求Json响应解析方法以及解读失败的原因

    这篇文章主要介绍了Golang HTTP请求Json响应解析方法以及解读失败的原因,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03
  • 一文带你吃透Golang中的类型转换

    一文带你吃透Golang中的类型转换

    Golang是一种强类型语言,所以Golang的类型转换和C/C++ java等语言的类型转换还有点区别,本文讲通过一些简单的示例带大家深入了解一下Golang中的类型转换,需要的可以参考下
    2023-05-05
  • 基于Go语言实现文件上传服务的示例代码

    基于Go语言实现文件上传服务的示例代码

    在 Web 开发中,文件上传 是常见需求,例如头像上传、文档存储、图片分享等功能,Go 语言的标准库 net/http 已经内置了对 multipart/form-data 类型的支持,能让我们轻松构建一个文件上传服务,本文将带你实现一个可运行的文件上传接口,需要的朋友可以参考下
    2025-08-08
  • 利用Go语言实现二叉搜索树

    利用Go语言实现二叉搜索树

    二叉树是一种常见并且非常重要的数据结构,在很多项目中都能看到二叉树的身影,当然它也有很多变种,本文要介绍的是二叉搜索树的实现,希望对大家有所帮助
    2023-07-07
  • 一文带你了解Go语言中的单元测试

    一文带你了解Go语言中的单元测试

    写过单元测试的开发人员应该理解,单元测试最核心的价值是为了证明:为什么我写的代码是正确的?也就是从逻辑角度帮你检查你的代码。本文就来和大家详细聊聊Go语言中的单元测试,需要的可以参考一下
    2022-07-07
  • 一文带你熟悉Go语言中的分支结构

    一文带你熟悉Go语言中的分支结构

    这篇文章主要和大家分享一下Go语言中的分支结构(if - else-if - else、switch),文中的示例代码讲解详细,对我们学习Go语言有一定的帮助,需要的可以参考一下
    2022-11-11

最新评论