Gin解决Cros问题

当客户端通过 AJAX 发送跨域请求时,浏览器会发送一个预检请求(preflight request),以检查服务器是否允许该请求。

预检请求是一个 OPTIONS 请求,用于获取服务器允许的请求方法、请求头部和响应头部等信息。 当服务器返回的响应中没有包含客户端请求所需的 Access-Control-Allow-Headers 响应头部时,浏览器会显示 "Request header field content-type is not allowed by Access-Control-Allow-Headers in preflight response" 错误消息。

要解决这个错误,需要在服务器端设置 Access-Control-Allow-Headers 响应头部,以允许客户端使用 Content-Type 请求头部字段。

gin中插入Cros代码如下:

func Cors() gin.HandlerFunc {
	return func(c *gin.Context) {
		method := c.Request.Method

		c.Header("Access-Control-Allow-Origin", "*")
		c.Header("Access-Control-Allow-Headers", "Content-Type,AccessToken,X-CSRF-Token, Authorization, Token")
		c.Header("Access-Control-Allow-Methods", "POST, GET, OPTIONS")
		c.Header("Access-Control-Expose-Headers", "Content-Length, Access-Control-Allow-Origin, Access-Control-Allow-Headers, Content-Type")
		c.Header("Access-Control-Allow-Credentials", "true")

		//放行所有OPTIONS方法
		if method == "OPTIONS" {
			c.AbortWithStatus(http.StatusNoContent)
		}
		// 处理请求
		c.Next()
	}
}

func main() {
    ...
    r.Use(Cros)
}

再来提一下上文说到的OPTIONS请求方法:

OPTIONS 请求是一个特殊的 HTTP 请求方法,通常用于获取与请求资源相关的元数据,如允许的 HTTP 方法、允许的请求头、允许的响应头、CORS 规则等。它在发送跨域请求时非常有用,因为它可以帮助客户端检查服务器是否允许该请求,从而避免安全漏洞。

当客户端使用某个 HTTP 方法或某些特殊的请求头或参数来发送 AJAX 请求时,浏览器会自动发送一个 OPTIONS 请求到服务器,以检查该请求是否被服务器所允许。如果服务器允许该请求,它会在响应头部中包含一些额外的信息,例如 Access-Control-Allow-Methods、Access-Control-Allow-Headers 和 Access-Control-Allow-Origin 等。

在客户端接收到 OPTIONS 请求的响应之后,它将根据响应中的信息来确定是否继续发送真正的请求。如果服务器没有返回允许的 HTTP 方法或请求头等信息,浏览器将阻止客户端继续发送请求,以避免跨域请求造成的安全风险。

因此,OPTIONS 请求在跨域请求中非常有用,因为它可以帮助客户端检查服务器是否允许该请求,从而避免跨域请求的安全漏洞。同时,它也可以帮助客户端了解如何正确地发送请求,以提高请求的成功率和效率。

需要注意的是,虽然 OPTIONS 请求是一种有效的跨域请求解决方案,但它也会在一定程度上增加请求的复杂性和延迟。因此,在设计跨域请求时,应该仅允许必需的 HTTP 方法和请求头,以减少请求的复杂性和延迟。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NUS Coders

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值