package middleware import ( "github.com/gin-gonic/gin" ) // CORS 返回一个允许指定来源跨域的中间件。 // 允许 origins 包含 "*" 时回显 *,否则回显请求 Origin 并放行对应来源。 func CORS(allowedOrigins []string) gin.HandlerFunc { allowAll := false originSet := make(map[string]struct{}, len(allowedOrigins)) for _, o := range allowedOrigins { if o == "*" { allowAll = true continue } originSet[o] = struct{}{} } return func(c *gin.Context) { origin := c.GetHeader("Origin") if origin == "" { c.Next() return } if allowAll { c.Header("Access-Control-Allow-Origin", "*") } else if _, ok := originSet[origin]; ok { c.Header("Access-Control-Allow-Origin", origin) c.Header("Vary", "Origin") } else { c.Next() return } c.Header("Access-Control-Allow-Methods", "GET,POST,PUT,PATCH,DELETE,OPTIONS") c.Header("Access-Control-Allow-Headers", "Content-Type,Authorization,X-Requested-With") c.Header("Access-Control-Max-Age", "86400") if c.Request.Method == "OPTIONS" { c.AbortWithStatus(204) return } c.Next() } }