Go Gin 允許跨域訪問

xfstart07發表於2017-12-19

上週五的時候,給介面新增了支援跨域訪問,所有做一下跨域方面的筆記。

HTTP 訪問控制 (CORS)

當一個資源從與該資源本身所在的伺服器不同的域或埠請求一個資源時,資源會發起一個跨域 HTTP 請求。

出於安全原因,瀏覽器限制從指令碼內發起的跨域 HTTP 請求。例如,XMLHttpRequest 和 Fetch API 遵循同源策略。這意味著使用這些 API 的 Web 應用程式只能從載入應用程式的同一個域請求 HTTP 資源,除非使用 CORS 標頭檔案。

跨域資源共享標準:規範要求,對那些可能對伺服器資料產生副作用的 HTTP 請求方法(特別是 GET 以外的 HTTP 請求,或者搭配某些 MIME 型別的 POST 請求),瀏覽器必須首先使用 OPTIONS 方法發起一個預檢請求(preflight request),從而獲知服務端是否允許該跨域請求。伺服器確認允許之後,才發起實際的 HTTP 請求。在預檢請求的返回中,伺服器端也可以通知客戶端,是否需要攜帶身份憑證(包括 Cookies 和 HTTP 認證相關資料)。

ps. 上面是 MDN 的文件介紹。

Gin 新增跨域中介軟體

Gin 是一個 Go 開發的 Web 框架,給 Gin 加 CORS 的支援也是非常簡單的。

CORS 中介軟體外掛

這是 Gin 官方的 CORS 中介軟體 https://github.com/gin-contrib/cors

使用 CORS

引入包

import "github.com/gin-contrib/cors"

允許所有源的配置

func main() {
    router := gin.Default()
    // same as
    // config := cors.DefaultConfig()
    // config.AllowAllOrigins = true
    // router.Use(cors.New(config))
    router.Use(cors.Default())
    router.Run()
}

自定義源的配置

config := cors.DefaultConfig()
config.AllowOrigins = []string{"http://google.com"}
config.AddAllowOrigins("http://facebook.com")

自定義其他配置:

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

主要的幾個配置介紹:

  • AllowOrigins 允許源列表
  • AllowAllOrigins 允許所有源,返回的格式 Access-Control-Allow-Origin: *
  • AllowMethods 允許的方法列表
  • AllowHeaders 允許的頭部資訊
  • AllowCredentials 允許暴露請求的響應,Access-Control-Allow-Credentials: true

資源

https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Access_control_CORS

https://developer.mozilla.org/en-US/docs/Web/HTTP/Server-Side_Access_Control

https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Access-Control-Allow-Credentials

https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Authentication

https://github.com/gin-contrib/cors

更多原創文章乾貨分享,請關注公眾號
  • Go Gin 允許跨域訪問
  • 加微信實戰群請加微信(註明:實戰群):gocnio

相關文章