前端跨域往往是一种很尴尬的问题,下面以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