全面解析Golang 中的 Gorilla CORS 中间件正确用法

 更新时间:2025年07月30日 11:40:19   作者:gopher.guo  
Golang 中使用 gorilla/mux 路由器配合 rs/cors 中间件库可以优雅地解决这个问题,然而,很多人刚开始使用时会遇到配置不生效的问题,本文将详细介绍其正确用法,感兴趣的朋友一起看看吧

如何让 Golang 中的 Gorilla CORS 中间件正确工作

在构建 RESTful API 时,**跨域资源共享(CORS)**是一个常见问题。前端请求后端接口时,若两者的域名、端口不同,浏览器就会触发跨域校验。若服务端未配置 CORS 策略,则浏览器会阻止请求。

Golang 中使用 gorilla/mux 路由器配合 rs/cors 中间件库可以优雅地解决这个问题。然而,很多人刚开始使用时会遇到配置不生效的问题,本文将详细介绍其正确用法。

一、基础依赖

确保安装以下依赖:

go get -u github.com/gorilla/mux
go get -u github.com/rs/cors

二、错误用法(很多人一开始都会这样写)

package main
import (
	"fmt"
	"net/http"
	"github.com/gorilla/mux"
	"github.com/rs/cors"
)
func main() {
	router := mux.NewRouter()
	router.HandleFunc("/api", func(w http.ResponseWriter, r *http.Request) {
		fmt.Fprintln(w, "Hello, CORS!")
	}).Methods("GET")
	// ❌ 错误:中间件未被真正使用
	c := cors.New(cors.Options{
		AllowedOrigins: []string{"*"},
	})
	http.ListenAndServe(":8080", router) // 忽略了 cors.Handler
}

虽然写了 cors.New(...),但实际上并没有将其作用于 HTTP 服务器上。这相当于创建了一个 CORS 配置但未使用。

三、正确用法

你需要将 cors.Handler 包装你的主路由器:

func main() {
	router := mux.NewRouter()
	router.HandleFunc("/api", func(w http.ResponseWriter, r *http.Request) {
		fmt.Fprintln(w, "Hello, CORS!")
	}).Methods("GET")
	// ✅ 正确:将 CORS 中间件包裹 router
	c := cors.New(cors.Options{
		AllowedOrigins:   []string{"*"},
		AllowedMethods:   []string{"GET", "POST", "PUT", "DELETE"},
		AllowedHeaders:   []string{"Content-Type"},
		AllowCredentials: true,
	})
	handler := c.Handler(router)
	http.ListenAndServe(":8080", handler)
}

四、如何验证是否生效

你可以通过以下方式测试:

  1. 用浏览器或 Postman 发起请求。
  2. 检查返回的响应头中是否有:
Access-Control-Allow-Origin: *

这说明服务端已允许跨域请求。

五、常见配置项说明

配置项说明
AllowedOrigins允许的来源,例如:[]string{"http://localhost:3000"}* 表示所有
AllowedMethods支持的方法,如 GET, POST, OPTIONS
AllowedHeaders允许的请求头,如 Content-Type, Authorization
AllowCredentials是否允许携带 cookie

六、OPTIONS 请求的问题

浏览器在发出跨域请求之前,通常会发出一个 OPTIONS 请求(预检)。务必确保你的路由器或中间件没有拦截 OPTIONS 请求。

示例:

router.Methods("OPTIONS").HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
	w.WriteHeader(http.StatusOK)
})

不过大多数时候 rs/cors 会自动处理 OPTIONS 请求,你无需手动添加。

七、小贴士

  • 开发阶段可以设置 AllowedOrigins: []string{"*"},但生产环境下应限制为指定域名。
  • 确保中间件被正确包裹 router,否则它根本不会生效。
  • 如果你还有认证逻辑,确保 cors 中间件放在最外层。

总结

在 Golang 项目中正确配置 CORS 是 API 可用性的基本要求之一。通过 gorilla/mux 搭配 rs/cors,你可以快速实现跨域支持。记住,最常见的错误就是:创建了中间件但没有包裹 router。只要绕开这个坑,你的跨域请求将顺利进行。

原文链接:https://duoke360.com/post/44220

到此这篇关于如何让 Golang 中的 Gorilla CORS 中间件正确用法的文章就介绍到这了,更多相关go gorilla cors 中间件用法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 关于Golang标准库flag的全面讲解

    关于Golang标准库flag的全面讲解

    这篇文章主要介绍了关于Golang标准库flag的全面讲解,这个库的代码量只有1000行左右,却提供了非常完善的命令行参数解析功能,更多相关内容需要的朋友可以参考一下
    2022-09-09
  • 深入理解Golang中Context的使用

    深入理解Golang中Context的使用

    本文主要介绍了Golang中Context的使用,特别是cancelCtx的实现,通过理解cancelCtx的数据结构、挂载机制和取消机制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2026-02-02
  • Go语言Time包的具体使用

    Go语言Time包的具体使用

    Go语言中有关于时间和日期的方法都在time包里面,本文主要介绍了Go语言Time包,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-07-07
  • Golang实践笔录之读取yaml配置文件

    Golang实践笔录之读取yaml配置文件

    YAML是YAML Ain't a Markup Language的缩写,YAML不是一种标记语言,相比JSON格式的方便,这篇文章主要给大家介绍了关于Golang实践笔录之读取yaml配置文件的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-01-01
  • 详解Golang中的交叉编译

    详解Golang中的交叉编译

    在 Golang 中,交叉编译指的是在同一台机器上生成针对不同操作系统或硬件架构的二进制文件,这在开发跨平台应用或构建特定平台的发布版本时非常有用,本文就详细的给大家介绍一下Golang中的交叉编译,需要的朋友可以参考下
    2023-08-08
  • Go中Context使用源码解析

    Go中Context使用源码解析

    这篇文章主要为大家介绍了Go中Context使用源码解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • Golang设计模式之工厂方法模式讲解和代码示例

    Golang设计模式之工厂方法模式讲解和代码示例

    工厂方法是一种创建型设计模式, 解决了在不指定具体类的情况下创建产品对象的问题,本文将通过代码示例详细给大家介绍一下Golang工厂方法模式,感兴趣的同学可以参考一下
    2023-06-06
  • 深入了解Go语言中database/sql是如何设计的

    深入了解Go语言中database/sql是如何设计的

    在 Go 语言中内置了 database/sql 包,它只对外暴露了一套统一的编程接口,便可以操作不同数据库,那么database/sql 是如何设计的呢,下面就来和大家简单聊聊吧
    2023-07-07
  • 通过案例详细聊聊Go语言的变量与常量

    通过案例详细聊聊Go语言的变量与常量

    在任何一门现代的高级语言中,变量和常量都是它非常基础的程序结构的组成部分,下面这篇文章主要给大家介绍了关于如何通过案例详细聊聊Go语言的变量与常量的相关资料,需要的朋友可以参考下
    2023-03-03
  • golang整合日志zap的实现示例

    golang整合日志zap的实现示例

    Go语言中的zap库提供了强大的日志管理功能,支持日志记录到文件、日志切割、多日志级别、结构化日志输出等,它通过三种方法zap.NewProduction()、zap.NewDevelopment()和zap.NewExample(),快速构建适用于不同环境的logger,感兴趣的可以了解一下
    2024-10-10

最新评论