道者编程

Gin设置跨域

什么是跨域:在浏览器上,一个网页的代码想要访问另一个网页的资源,但这两个网页的域名不同,或者同一个域名下的不同子域名,也可能是端口号不同。例如,页面 A 想要读取页面 B 的信息,但由于安全策略的限制,这种跨域访问是被浏览器禁止的。这是为了保障用户信息在网络上的安全性。因此,跨域要通过其他方法,比如使用 JSONP 或者 CORS 等技术手段来实现。

我们新建一个cors.go的中间件

package middleware

import (
	"net/http"

	"github.com/gin-gonic/gin"
)

// 设置跨域
func Cors() gin.HandlerFunc {
	return func(c *gin.Context) {
		//指定允许跨域请求的域名/请求头
		c.Writer.Header().Set("Access-Control-Allow-Origin", "*")

		//指定允许的 HTTP 请求方法
		c.Writer.Header().Set("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE")

		// 指定允许的请求头字段
		c.Writer.Header().Set("Access-Control-Allow-Headers", "Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization")

		// 如果客户端发送的是 OPTIONS 请求,那么中间件会中止响应并返回 HTTP 状态码 204
		if c.Request.Method == "OPTIONS" {
			c.AbortWithStatus(http.StatusNoContent)
			return
		}

		c.Next()
	}
}
 然后注册到中间件中

r := gin.New()
r.Use(middleware.Cors()) //跨域中间件,必须在路由之前
 这样就实现了跨域

温馨提示:r := gin.New() 创建一个新的 gin engine 实例,不会自动设置任何中间件,需要手动添加中间件。而r := gin.Default()则会自动使用 Logger 和 Recovery 中间件,这两个中间件对于记录日志和恢复从 panic 中恢复很有用。通常来说,如果你需要对 Gin 的行为进行更精细的控制,则应该选择r := gin.New();而如果你想快速地启动一个默认的 Gin 应用程序,则应该选择r := gin.Default()。

建议生产环境用r := gin.New()


最新评论:
我要评论:

看不清楚