Loading

Go在Gin中解决CORS中间件没生效的问题

起因

最近在写前后端分离项目,然后在前端访问后端提供的接口时,会出现CORS问题。

查找资料发现,Gin官方是有提供中间件的https://github.com/gin-contrib/cors

先在terminal输入 go get github.com/gin-contrib/cors

然后就按照官方的使用例子就行:

package main

import (
  "time"

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

func main() {
  router := gin.Default()
  router.Use(cors.Default())
  router.Run()
}

然后我以为这个是可以作用于路由,于是就这么用了:

package main

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

func main() {

	engine := gin.Default()
	myGroup := engine.Group("/myGroup").Use(cors.Default())
	{
		myGroup.GET("/myRouter", func(c *gin.Context) {
			c.JSON(200, gin.H{
				"message": "myRouter",
			})
		})
	}
}

结果我调试了,还以为是CORS中间件出问题了。

过程

最后定位到是Gin中的Engine.Use()RouterGroup.Use()的实现是不同的:

image-20240122192947499

image-20240122192934662

可以看到gin.EngineUse()gin.RouterGroupUse()多两个调用

image-20240122193232916

这两个调用其实影响的是Engine.allNoMethodEngine.allNoRoute,也就是在所有[方法:路由]处理前都会调用的中间件。

解决方法

于是只需要在最开始分配Engine的时候Use(cors.Default())就好啦

posted @ 2024-01-22 19:38  ViKyanite  阅读(49)  评论(0编辑  收藏  举报