在 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") // 启动服务
}
解释:
AllowOrigins
:指定允许访问的域名。如果你允许所有域名访问,可以设置为[]string{"*"}
,但最好限制为实际需要的域名以提高安全性。AllowMethods
:指定允许的 HTTP 请求方法,如GET
、POST
、PUT
等。AllowHeaders
:指定允许的请求头。你可以在此列出你允许的头部字段,如Origin
、Content-Type
和Authorization
。AllowCredentials
:如果你需要允许跨域请求携带 Cookie 或其他凭证数据,设置为true
。如果不需要,则可以设置为false
。
其他常用配置项:
-
AllowHeaders
:可以用于定义哪些 HTTP 请求头是允许的。比如,Authorization
或X-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")
}
关键点说明:
AllowOrigins: []string{"\*"}
:- 设置为
"*"
表示允许所有来源。 - 注意: 如果设置
AllowCredentials: true
(允许携带凭证),则不能将AllowOrigins
设置为"*"
,这是因为带凭证的跨域请求要求明确指定来源。
- 设置为
AllowMethods
:- 列出所有需要支持的 HTTP 请求方法,比如
GET
、POST
、OPTIONS
等。
- 列出所有需要支持的 HTTP 请求方法,比如
AllowHeaders
:- 指定允许的请求头,比如
Content-Type
、Authorization
。
- 指定允许的请求头,比如
AllowCredentials: false
:- 这里设置为
false
,因为"*"
作为通配符不能与AllowCredentials: true
一起使用。如果确实需要允许凭证,建议显式设置AllowOrigins
为特定域名。
- 这里设置为
ExposeHeaders
:- 配置允许前端访问的响应头(可选)。