Go gin framework CORS

前端 未结 7 1362
逝去的感伤
逝去的感伤 2020-12-08 21:05

I\'m using Go gin framework gin

func CORSMiddleware() gin.HandlerFunc {
    return func(c *gin.Context) {
        c.Writer.Header().Set(\"Content-Type\", \"a         


        
相关标签:
7条回答
  • 2020-12-08 21:12

    We created a minimal middleware.

    import (
        "github.com/gin-gonic/gin"
        "net/http"
    )
    
    type optionsMiddleware struct {
    
    }
    
    func CreateOptionsMiddleware() *optionsMiddleware{
        return &optionsMiddleware{}
    }
    
    func (middleware *optionsMiddleware)Response(context *gin.Context){
        if context.Request.Method == "OPTIONS" {
            context.AbortWithStatus(http.StatusNoContent)
        }
    }
    

    and register it with gin middleware :

    app  := gin.New()
    app.Use(middleware.CreateOptionsMiddleware().Response).
        Use(next-middleware)......
    
    0 讨论(0)
  • 2020-12-08 21:13

    There is also official gin's middleware for handling CORS requests github.com/gin-contrib/cors.

    You could install it using $ go get github.com/gin-contrib/cors and then add this middleware in your application like this: package main

    import (
        "time"
    
        "github.com/gin-contrib/cors"
        "github.com/gin-gonic/gin"
    )
    
    func main() {
        router := gin.Default()
        // CORS for https://foo.com and https://github.com origins, allowing:
        // - PUT and PATCH methods
        // - Origin header
        // - Credentials share
        // - Preflight requests cached for 12 hours
        router.Use(cors.New(cors.Config{
            AllowOrigins:     []string{"https://foo.com"},
            AllowMethods:     []string{"PUT", "PATCH"},
            AllowHeaders:     []string{"Origin"},
            ExposeHeaders:    []string{"Content-Length"},
            AllowCredentials: true,
            AllowOriginFunc: func(origin string) bool {
                return origin == "https://github.com"
            },
            MaxAge: 12 * time.Hour,
        }))
        router.Run()
    }
    
    0 讨论(0)
  • 2020-12-08 21:16

    There is an official gin cors plugin gin-contrib/cors. You should use it

    0 讨论(0)
  • 2020-12-08 21:17
    func CORSMiddleware() gin.HandlerFunc {
        return func(c *gin.Context) {
    
            c.Header("Access-Control-Allow-Origin", "*")
            c.Header("Access-Control-Allow-Credentials", "true")
            c.Header("Access-Control-Allow-Headers", "Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization, accept, origin, Cache-Control, X-Requested-With")
            c.Header("Access-Control-Allow-Methods", "POST,HEAD,PATCH, OPTIONS, GET, PUT")
    
            if c.Request.Method == "OPTIONS" {
                c.AbortWithStatus(204)
                return
            }
    
            c.Next()
        }
    }
    

    then use it

    router = gin.New()  
    router.Use(CORSMiddleware())
    
    0 讨论(0)
  • 2020-12-08 21:21

    There is package https://github.com/rs/cors, that handles CORS requests in the right way. It has the examples for the popular routers including gin. That it:

    package main
    
    import (
        "net/http"
    
        "github.com/gin-gonic/gin"
        cors "github.com/rs/cors/wrapper/gin"
    )
    
    func main() {
        router := gin.Default()
    
        router.Use(cors.Default())
        router.GET("/", func(context *gin.Context) {
            context.JSON(http.StatusOK, gin.H{"hello": "world"})
        })
    
        router.Run(":8080")
    }
    

    In common case, you just add the default handling with router.Use(cors.Default()) to your middlewares in gin. It is enough.

    0 讨论(0)
  • 2020-12-08 21:23

    This worked for me - NOTE: the setting of header directly.

    func CORSMiddleware() gin.HandlerFunc {
        return func(c *gin.Context) {
    
            c.Header("Access-Control-Allow-Origin", "*")
            c.Header("Access-Control-Allow-Headers", "*")
            /*
                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", "access-control-allow-origin, access-control-allow-headers")
                c.Writer.Header().Set("Access-Control-Allow-Methods", "GET, HEAD, POST, PUT, DELETE, OPTIONS, PATCH")
            */
    
            if c.Request.Method == "OPTIONS" {
                c.AbortWithStatus(204)
                return
            }
    
            c.Next()
        }
    }
    
    0 讨论(0)
提交回复
热议问题