關於go的跨域處理 gin

gaoyangy發表於2018-04-11

前端跨域往往是一種很尷尬的問題,下面以golang為例子寫個跨域的處理方式

package main

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

func main() {
    r := gin.Default()
    r.Use(CorsMiddleware())
    // 使用中介軟體的方式區分大小寫
    r.GET("/", func(c *gin.Context) {
            c.JSON(200, gin.H{
                "message": "hello, sir, i'm golong",
            })
    })
    r.POST("/abouts", func(c *gin.Context) {
            c.JSON(200, gin.H{
                "data": nil,
                "message": "hello, sir, i'm golong",
            })
        })
    r.Run(":7000")
}

func CorsMiddleware() gin.HandlerFunc {
    return func(c *gin.Context) {
        method := c.Request.Method
        origin := c.Request.Header.Get("Origin")
        var filterHost = [...]string{"http://localhost.*","http://*.hfjy.com"}
        // filterHost 做過濾器,防止不合法的域名訪問
        var isAccess = false
        for _, v := range(filterHost) {
            match, _ := regexp.MatchString(v, origin)
            if match {
                isAccess = true
            }
        }
        if isAccess {
        // 核心處理方式
            c.Header("Access-Control-Allow-Origin", "*")
            c.Header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept")
            c.Header("Access-Control-Allow-Methods", "GET, OPTIONS, POST, PUT, DELETE")
            c.Set("content-type", "application/json")
        }
        //放行所有OPTIONS方法
        if method == "OPTIONS" {
            c.JSON(http.StatusOK, "Options Request!")
        }

      c.Next()
    }
  }
複製程式碼

跨域是瀏覽器的行為,但是往往前端處理只有jsonp的方式,當然也可以設定白名單,或者postMessage 以及 iframe等等,但是往往不能做到很友好的方式,所以就有了nginx處理跨域問題,當然後端也是可以的核心問題就是 Access-Control-Allow-Origin

相關文章