此篇背景:最近在写用 go 语言开发公司 web 端,写到使用 jwt 做中间件实现权限和身份认证,想到把 token 不作为参数传递了,而是放在 header 里面,然后用 go 获取 header 里面的 token,省的乱七八糟的 api 接口都带 token 参数,此前我是使用 axios 做前端请求,使用gin-contrib/cors中间件的
cors.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 里面加了一个字段
果然不行了
配置了之后
正常