在 Gin 框架中,处理 CORS (跨域资源共享) 问题非常简单。你可以使用 gin-contrib/cors 包来处理跨域请求。

安装 gin-contrib/cors

首先,你需要安装 gin-contrib/cors 包,它是一个用于处理 CORS 的中间件。

go get -u github.com/gin-contrib/cors

在 Gin 中配置 CORS

然后,你可以在 Gin 应用中使用这个中间件来处理跨域请求。你可以根据需要配置允许哪些源访问你的 API、支持哪些 HTTP 方法、是否允许带上凭证等。

示例:在 Gin 中配置 CORS

package main

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

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

	// 配置 CORS 中间件
	r.Use(cors.New(cors.Config{
		AllowOrigins:     []string{"http://localhost:8080"},  // 允许访问的源
		AllowMethods:     []string{"GET", "POST", "PUT", "DELETE"},  // 允许的请求方法
		AllowHeaders:     []string{"Origin", "Content-Type", "Authorization"},  // 允许的请求头
		AllowCredentials: true,  // 允许跨域请求携带凭证 (如 Cookie)
	}))

	r.GET("/api/random", func(c *gin.Context) {
		// 返回数据
		c.JSON(http.StatusOK, gin.H{
			"data": "example data",
		})
	})

	r.Run(":8086")  // 启动服务
}

解释:

  1. AllowOrigins:指定允许访问的域名。如果你允许所有域名访问,可以设置为 []string{"*"},但最好限制为实际需要的域名以提高安全性。
  2. AllowMethods:指定允许的 HTTP 请求方法,如 GETPOSTPUT 等。
  3. AllowHeaders:指定允许的请求头。你可以在此列出你允许的头部字段,如 OriginContent-TypeAuthorization
  4. AllowCredentials:如果你需要允许跨域请求携带 Cookie 或其他凭证数据,设置为 true。如果不需要,则可以设置为 false

其他常用配置项:

  • AllowHeaders:可以用于定义哪些 HTTP 请求头是允许的。比如,AuthorizationX-Requested-With 等。

  • MaxAge:指定浏览器缓存 CORS 预检请求的时间,单位是秒。

说明:

  • AllowOrigins:可以配置允许的跨域源。如果你有多个前端环境,或者你需要为不同的环境(开发、生产)配置不同的域名,可以在这里添加多个允许的域名。
  • MaxAge:该字段决定了浏览器是否会缓存预检请求的结果。设置为 12 * 3600 意味着浏览器会缓存 CORS 预检请求的结果 12 小时。

其他细节

  • 如果你允许凭证(如 Cookie)跨域,你需要在前端请求时设置 withCredentials
  • 在开发环境中,确保前端和后端的端口号是不同的,这时需要使用上述的 cors 中间件来允许跨域。

允许任意源的 CORS 配置

package main

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

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

	// 配置 CORS 中间件允许任意源
	r.Use(cors.New(cors.Config{
		AllowOrigins:     []string{"*"},  // 允许所有来源
		AllowMethods:     []string{"GET", "POST", "PUT", "DELETE", "OPTIONS"},  // 允许的请求方法
		AllowHeaders:     []string{"Origin", "Content-Type", "Authorization"},  // 允许的请求头
		ExposeHeaders:    []string{"Content-Length", "Content-Type"},  // 允许前端访问的响应头
		AllowCredentials: false,  // 不允许跨域请求携带凭证
	}))

	// 示例路由
	r.GET("/api/random", func(c *gin.Context) {
		c.JSON(http.StatusOK, gin.H{
			"data": "example data",
		})
	})

	// 启动服务器
	r.Run(":8086")
}

关键点说明:

  1. AllowOrigins: []string{"\*"}
    • 设置为 "*" 表示允许所有来源。
    • 注意: 如果设置 AllowCredentials: true(允许携带凭证),则不能将 AllowOrigins 设置为 "*",这是因为带凭证的跨域请求要求明确指定来源。
  2. AllowMethods
    • 列出所有需要支持的 HTTP 请求方法,比如 GETPOSTOPTIONS 等。
  3. AllowHeaders
    • 指定允许的请求头,比如 Content-TypeAuthorization
  4. AllowCredentials: false
    • 这里设置为 false,因为 "*" 作为通配符不能与 AllowCredentials: true 一起使用。如果确实需要允许凭证,建议显式设置 AllowOrigins 为特定域名。
  5. ExposeHeaders
    • 配置允许前端访问的响应头(可选)。