Golang Gin框架中的跨域资源共享(CORS)配置

在使用Golang Gin框架开发API时遇到了跨域问题。想请教大家如何正确配置CORS中间件?我尝试使用gin-contrib/cors包,但发现options预检请求总是失败,前端仍然报跨域错误。具体配置如下:

r := gin.Default()
r.Use(cors.New(cors.Config{
    AllowOrigins:     []string{"http://localhost:3000"},
    AllowMethods:     []string{"GET", "POST"},
    AllowHeaders:     []string{"Content-Type"},
    ExposeHeaders:    []string{"Content-Length"},
    AllowCredentials: true,
    MaxAge:           12 * time.Hour,
}))

但实际测试时,POST请求还是会被浏览器拦截。请问我的配置哪里有问题?是否需要额外处理OPTIONS方法?另外,在生产环境中应该注意哪些CORS相关的安全问题?


更多关于Golang Gin框架中的跨域资源共享(CORS)配置的实战教程也可以访问 https://www.itying.com/category-94-b0.html

3 回复

在Gin框架中配置CORS非常简单。首先确保你安装了github.com/gin-contrib/cors中间件。然后可以这样配置:

package main

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

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

    config := cors.DefaultConfig()
    config.AllowOrigins = []string{"http://example.com"} // 允许的域名
    config.AllowMethods = []string{"GET", "POST", "PUT", "DELETE"} // 允许的方法
    config.AllowHeaders = []string{"Authorization", "Content-Type"} // 允许的请求头
    config.AllowCredentials = true // 是否允许携带凭证

    r.Use(cors.New(config))

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

    r.Run(":8080")
}

这段代码设置了基本的CORS规则,允许来自http://example.com的请求,并且允许携带凭证。你可以根据需要调整这些参数。比如增加更多的允许方法或请求头等。记住,生产环境中一定要谨慎配置AllowOrigins以防止安全漏洞。

更多关于Golang Gin框架中的跨域资源共享(CORS)配置的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在Gin框架中配置CORS非常简单。你可以使用github.com/gin-contrib/cors中间件来实现。

首先安装依赖:

go get github.com/gin-contrib/cors

然后在你的路由之前添加CORS配置:

package main

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

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

    // CORS配置
    config := cors.DefaultConfig()
    config.AllowOrigins = []string{"http://example.com"} // 允许的域名
    config.AllowMethods = []string{"GET", "POST", "PUT", "DELETE"} // 允许的方法
    config.AllowHeaders = []string{"Authorization", "Content-Type"} // 允许的头部
    config.AllowCredentials = true // 是否允许发送Cookie
    config.AddAllowOrigin("http://another-example.com") // 可以添加多个允许域名

    r.Use(cors.New(config))

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

    r.Run() // 监听并在 0.0.0.0:8080 上启动服务
}

这样就完成了基本的CORS配置。可以根据实际需求调整允许的域名、方法和头部等信息。

在Gin框架中配置CORS可以通过中间件实现。以下是两种常见的实现方式:

  1. 使用cors中间件(推荐):
package main

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

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

	// 配置CORS中间件
	r.Use(cors.New(cors.Config{
		AllowOrigins:     []string{"https://example.com", "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("/ping", func(c *gin.Context) {
		c.String(200, "pong")
	})

	r.Run()
}
  1. 手动实现中间件:
func CORSMiddleware() gin.HandlerFunc {
	return func(c *gin.Context) {
		c.Writer.Header().Set("Access-Control-Allow-Origin", "*")
		c.Writer.Header().Set("Access-Control-Allow-Credentials", "true")
		c.Writer.Header().Set("Access-Control-Allow-Headers", "Content-Type, Content-Length, Authorization, Accept, X-Requested-With")
		c.Writer.Header().Set("Access-Control-Allow-Methods", "POST, OPTIONS, GET, PUT, DELETE")

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

		c.Next()
	}
}

func main() {
	r := gin.Default()
	r.Use(CORSMiddleware())
	// ... 其他路由
	r.Run()
}

主要配置项说明:

  • AllowOrigins: 允许访问的域名列表
  • AllowMethods: 允许的HTTP方法
  • AllowHeaders: 允许的请求头
  • AllowCredentials: 是否允许发送cookie
  • MaxAge: 预检请求有效期

建议使用gin-contrib/cors包,它提供了更完整的CORS配置选项。

回到顶部