Go gin framework CORS

Я использую структуру Go gin gin

func CORSMiddleware() gin.HandlerFunc {
    return func(c *gin.Context) {
        c.Writer.Header().Set("Content-Type", "application/json")
        c.Writer.Header().Set("Access-Control-Allow-Origin", "*")
        c.Writer.Header().Set("Access-Control-Max-Age", "86400")
        c.Writer.Header().Set("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE, UPDATE")
        c.Writer.Header().Set("Access-Control-Allow-Headers", "Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization, X-Max")
        c.Writer.Header().Set("Access-Control-Allow-Credentials", "true")

        if c.Request.Method == "OPTIONS" {
            c.AbortWithStatus(200)
        } else {
            c.Next()
        }
    }
}

У меня есть код состояния: 200 OK, но после запроса OPTIONS ничего не происходит. Похоже, я что-то упустил, но не могу понять, в чем я ошибаюсь.

Кто-нибудь может мне помочь?


person qwertmax    schedule 02.04.2015    source источник


Ответы (6)


FWIW, это мое промежуточное ПО CORS, которое работает для моих нужд.

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, Accept-Encoding, X-CSRF-Token, Authorization, accept, origin, Cache-Control, X-Requested-With")
        c.Writer.Header().Set("Access-Control-Allow-Methods", "POST, OPTIONS, GET, PUT")

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

        c.Next()
    }
}
person Jack    schedule 03.04.2015
comment
Почему 204? Почему не 200? - person qwertmax; 04.04.2015
comment
HTTP NoContent потому что да! - person Billcountry; 16.07.2020
comment
Почти 6 лет и все еще отлично. Решил мою проблему в кратчайшие сроки. И все же мне интересно, почему этого нет в официальной документации на github ... - person ; 14.10.2020
comment
Спасибо, @Jack. Можно добавить это только в корень приложения. Не работает только для групповых маршрутов приложения, для которого я добавил некоторые условия на основе URL-адреса маршрута. - person Gireesh Kudipudi; 03.12.2020
comment
c.Writer.Header().Set("Access-Control-Allow-Origin", "*") это может привести к тому, что браузер столкнется с проблемой cors, в этом случае необходимо указать конкретное происхождение вместо *. - person user218867; 26.04.2021

Существует также официальное промежуточное ПО gin для обработки запросов CORS github.com/gin-contrib/cors.

Вы можете установить его, используя $ 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()
    // 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()
}
person Dracontis    schedule 13.02.2018
comment
Этот ответ подготовлен, потому что я все еще могу столкнуться с этим вопросом в Google, поэтому он может быть очень полезен для людей, которые ищут решение проблем с джинсами. Кроме того, текст ответа повторяет readme со страницы github, поскольку чистые ссылки не являются хорошей практикой для ответа SO. - person Dracontis; 13.02.2018
comment
Если вы используете AllowOriginFunc, ваше происхождение, определенное в AllowOrigins, будет проигнорировано. AllowOriginFunc is a custom function to validate the origin. It take the origin as argument and returns true if allowed or false otherwise. If this option is set, the content of AllowOrigins is ignored. - person drocha87; 19.05.2021

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()
    }
}

тогда используйте это

router = gin.New()  
router.Use(CORSMiddleware())
person Rahul S    schedule 09.09.2020

Мы создали минимальное промежуточное ПО.

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)
    }
}

и зарегистрируем его с помощью промежуточного программного обеспечения gin:

app  := gin.New()
app.Use(middleware.CreateOptionsMiddleware().Response).
    Use(next-middleware)......
person Rahul Garg    schedule 13.11.2017

Есть пакет https://github.com/rs/cors, который обрабатывает запросы CORS справа. способ. В нем есть примеры для популярных маршрутизаторов, включая gin. Это:

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")
}

В общем случае вы просто добавляете обработку по умолчанию с router.Use(cors.Default()) к вашим промежуточным программам в gin. Достаточно.

person Alexander I.Grafov    schedule 21.02.2019

Это сработало для меня - ПРИМЕЧАНИЕ: настройка заголовка напрямую.

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()
    }
}
person Hayden Wiltshire    schedule 27.11.2020