gin框架使用路由组时不能跨域

1. 运行环境

go 环境

go1.20.4 windows/amd64
github.com/gin-gonic/gin v1.9.0
github.com/gin-contrib/cors

windows 环境

版本 Windows 11 专业版
版本 22H2
操作系统版本 22621.1635

2. 问题描述?

当使用路由组时,跨域中间件无效
前端使用fetch api 请求后端数据

    app:= gin.Default()
    app.Use(cors.Default())
    v1:=app.Group("/staff")
    {
        v1.GET("/", func(c *gin.Context) {
            c.JSON(200,gin.H{"name":"zzh"})
        })
    }
    app:= gin.Default()
    v1:=app.Group("/staff").Use(cors.Default())
    {
        v1.GET("/", func(c *gin.Context) {
            c.JSON(200,gin.H{"name":"zzh"})
        })
    }
    app:= gin.Default()
    v1:=app.Group("/staff",cors.Default())
    {
        v1.GET("/", func(c *gin.Context) {
            c.JSON(200,gin.H{"name":"zzh"})
        })
    }

以上三种写法都不能跨域
has been blocked by CORS policy: No ‘Access-Control-Allow-Origin’ header is present on the requested resource. If an opaque response serves your needs, set the request’s mode to ‘no-cors’ to fetch the resource with CORS disabled

    app:= gin.Default()
    app.Use(cors.Default())
    app.GET("/staff", func(c *gin.Context) {
            c.JSON(200,gin.H{"name":"zzh"})
    })

不使用路由组时可以跨域

3. 您期望得到的结果?

使用路由组可以正常跨域
//: <> (能截图就截图。)

4. 您实际得到的结果?

讨论数量: 6

写个跨域中间件

package middleware

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

// Cors 跨域中间件
func Cors() gin.HandlerFunc {
return func(ctx *gin.Context) {

    // 允许跨域
    ctx.Header("Access-Control-Max-Age", "1800")
    ctx.Header("Access-Control-Allow-Origin", "*")
    ctx.Header("Access-Control-Allow-Credentials", "true")
    ctx.Header("Content-Type", "application/json; charset=utf-8")
    ctx.Header("Access-Control-Allow-Methods", "GET, POST, PATCH, PUT, DELETE, OPTIONS, PATCH")
    ctx.Header("Access-Control-Allow-Headers", "Token, Authorization, i-api-key, Content-Type, If-Match, If-Modified-Since, If-None-Match, If-Unmodified-Since, X-CSRF-TOKEN, X-Requested-With")
    ctx.Header("Access-Control-Expose-Headers", "Content-Type, Content-Length, Access-Control-Allow-Origin, Access-Control-Allow-Headers")

    // 放行所有OPTIONS方法
    if strings.ToUpper(ctx.Request.Method) == "OPTIONS" {
        ctx.AbortWithStatus(http.StatusNoContent)
    }

    ctx.Next()
}

}

然后Use一下就可以了

10个月前 评论
terryzzh (楼主) 10个月前
racns (作者) 10个月前

你那个报错是用的你给的例子也会报错吗?通常报错是逻辑有问题报错也会出现跨域问题。最好单独的先测试下

10个月前 评论
巴啦啦

这个我曾今好像遇到过,我重新封装了一下框架,之后可能会开放出来,你别用gin.Default()。整体来说gin的路由非常快,但是存在一定的顺序和污染问题,需要规定规范路由使用方式。

app:=gin.New()
v1:=app.Group("/staff")
v1.Use(cors.Default())
10个月前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!