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

196 阅读2分钟

此篇背景:最近在写用 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 里面加了一个字段 测试加一个字段不进行配置 果然不行了 测试不配置会错误 配置了之后 配置新加的字段跨域 正常 配置后正常

❀❀❀❀❀❀ 完结散花 ❀❀❀❀❀❀

Written ❤️ sywdebug.