如何在Golang中实现跨域请求支持

来源:站长源码作者:小白龙头衔:草根站长
导读:本期聚焦于小伙伴创作的《如何在Golang中实现跨域请求支持》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《如何在Golang中实现跨域请求支持》有用,将其分享出去将是对创作者最好的鼓励。

跨域请求是指浏览器从一个域名的网页去请求另一个域名的资源时,域名、端口、协议任意一个不同就会触发跨域限制,这是浏览器的同源策略导致的。在Golang开发的HTTP服务中,我们可以通过配置响应头的方式支持跨域请求。

如何在Golang中实现跨域请求支持

不使用第三方框架实现跨域

如果使用Golang标准库的net/http开发HTTP服务,我们可以自定义一个中间件来处理跨域相关的响应头。首先定义中间件函数,在中间件中给每个响应添加对应的跨域头信息。

package main

import (
	"net/http"
)

// 跨域中间件
func corsMiddleware(next http.Handler) http.Handler {
	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		// 允许的请求源,生产环境建议指定具体域名
		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")
		// 是否允许携带凭证
		w.Header().Set("Access-Control-Allow-Credentials", "true")
		// 预检请求缓存时间,单位秒
		w.Header().Set("Access-Control-Max-Age", "86400")

		// 处理OPTIONS预检请求,直接返回成功
		if r.Method == "OPTIONS" {
			w.WriteHeader(http.StatusNoContent)
			return
		}
		next.ServeHTTP(w, r)
	})
}

func helloHandler(w http.ResponseWriter, r *http.Request) {
	w.Write([]byte("hello golang cors"))
}

func main() {
	mux := http.NewServeMux()
	mux.HandleFunc("/hello", helloHandler)

	// 使用跨域中间件包装路由
	handler := corsMiddleware(mux)
	http.ListenAndServe(":8080", handler)
}

跨域响应头参数说明

  • Access-Control-Allow-Origin:指定允许访问该资源的外部请求源,*表示允许所有源,生产环境建议设置为具体的域名,比如https://ipipp.com。
  • Access-Control-Allow-Methods:指定允许的HTTP请求方法,多个方法用逗号分隔。
  • Access-Control-Allow-Headers:指定允许的请求头字段,前端自定义的头需要在这里声明。
  • Access-Control-Allow-Credentials:设置为true时允许请求携带Cookie等凭证,此时Access-Control-Allow-Origin不能设置为*。
  • Access-Control-Max-Age:预检请求的缓存时间,在缓存时间内浏览器不会再发送预检请求。

使用gin框架实现跨域

gin是Golang中常用的Web框架,实现跨域的方式更加简洁,我们可以自定义中间件或者使用第三方库。这里先介绍自定义中间件的实现方式,逻辑和标准库的实现类似。

package main

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

// gin跨域中间件
func cors() gin.HandlerFunc {
	return func(c *gin.Context) {
		c.Header("Access-Control-Allow-Origin", "*")
		c.Header("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS")
		c.Header("Access-Control-Allow-Headers", "Content-Type, Authorization")
		c.Header("Access-Control-Allow-Credentials", "true")
		c.Header("Access-Control-Max-Age", "86400")

		if c.Request.Method == "OPTIONS" {
			c.AbortWithStatus(204)
			return
		}
		c.Next()
	}
}

func main() {
	r := gin.Default()
	// 注册跨域中间件
	r.Use(cors())

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

	r.Run(":8080")
}

如果不想自己实现中间件,也可以使用gin的第三方CORS库,首先通过命令安装依赖:

go get github.com/gin-contrib/cors

然后使用库提供的配置方式实现跨域,这种方式可以更灵活地配置允许的源、方法等参数。

package main

import (
	"time"

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

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

	// 配置跨域
	r.Use(cors.New(cors.Config{
		AllowOrigins:     []string{"https://ipipp.com"}, // 允许的源
		AllowMethods:     []string{"GET", "POST", "PUT", "DELETE", "OPTIONS"},
		AllowHeaders:     []string{"Content-Type", "Authorization"},
		ExposeHeaders:    []string{"Content-Length"},
		AllowCredentials: true,
		MaxAge:           12 * time.Hour,
	}))

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

	r.Run(":8080")
}

跨域配置注意事项

不要在生产环境随意将Access-Control-Allow-Origin设置为*,这会引入安全风险,建议只允许可信的域名访问接口。如果接口需要携带Cookie等凭证,Access-Control-Allow-Origin必须设置为具体的域名,不能使用通配符。

另外,预检请求是浏览器自动发送的OPTIONS请求,不需要前端额外处理,后端只需要正确响应即可。如果配置的跨域头不生效,可以检查响应头是否正确返回,或者是否有其他中间件覆盖了跨域配置。

Golang跨域请求CORSHTTP服务gin框架修改时间:2026-07-01 07:54:37

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。