go语言解决自定义header的跨域问题

此篇背景:最近在写用 go 语言开发公司 web 端,写到使用 jwt 做中间件实现权限和身份认证,想到把 token 不作为参数传递了,而是放在 header 里面,然后用 go 获取 header 里面的 token,省的乱七八糟的 api 接口都带 token 参数,此前我是使用 axios 做前端请求,使用gin-contrib/cors中间件的cors.Default()完成跨域,以为使用这个就完全不用管的配全了,毕竟官网也写了允许所有来源
官网Default()描述
但是将 token 放到 header 后就是不行,不放就可以,查了下资料解决问题,记录一下

首先不使用 gin-contrib/cors 中间件,而是自己写一个,看网上的大概就是这样,试了一下也是可以正常使用

func Cors(context *gin.Context) {
	method := context.Request.Method
	// 必须,接受指定域的请求,可以使用*不加以限制,但不安全
	context.Header("Access-Control-Allow-Origin", "*")
	// context.Header("Access-Control-Allow-Origin", context.GetHeader("Origin"))
	fmt.Println(context.GetHeader("Origin"))
	// 必须,设置服务器支持的所有跨域请求的方法
	context.Header("Access-Control-Allow-Methods", "POST, GET, PUT, DELETE, OPTIONS")
	// 服务器支持的所有头信息字段,不限于浏览器在"预检"中请求的字段
	context.Header("Access-Control-Allow-Headers", "Content-Type, Content-Length, Token")
	// 可选,设置XMLHttpRequest的响应对象能拿到的额外字段
	context.Header("Access-Control-Expose-Headers", "Access-Control-Allow-Headers, Token")
	// 可选,是否允许后续请求携带认证信息Cookir,该值只能是true,不需要则不设置
	context.Header("Access-Control-Allow-Credentials", "true")
	// 放行所有OPTIONS方法
	if method == "OPTIONS" {
		context.AbortWithStatus(http.StatusNoContent)
		return
	}
	context.Next()
}

然后看是哪里的区别来着,瞅了一眼官网的典型例子
官网典型例子
然后拉了下来参考上面改了些东西,就可以用了

r.Use(cors.New(cors.Config{
	AllowOrigins:     []string{"*"},
	AllowMethods:     []string{"POST, GET, PUT, DELETE, OPTIONS"},
	// 主要就是下面这两个,带上token就可以了
	AllowHeaders:     []string{"Content-Type, Content-Length, Token"},
	ExposeHeaders:    []string{"Access-Control-Allow-Headers, Token"},
	AllowCredentials: true,
}))

为了测试这两个是怎么个一回事,又在 header 里面加了一个字段
测试加一个字段不进行配置
果然不行了
测试不配置会错误
配置了之后
配置新加的字段跨域
正常
配置后正常

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值