Go Blog 项目中 gin-contrib/cors 详解
中间件是 Gin 官方提供的gin-contrib/cors
,已经通过
cors.New(
cors.Config{
...
}
)
提供了一个现成的中间件。只要在cors.Config{}
选好配置就行。
1.AllowHeaders
字段 []string
对应 CORS 协议的`Access-Control-Allow-Headers`
MDN中表示:
响应首部
Access-Control-Allow-Headers
用于 preflight request (预检请求)中,列出了将会在正式请求的Access-Control-Request-Headers
字段中出现的首部信息。
也就是说,不在 AllowHeader 中,Authorization 首部就不允许出现在请求报文中。
- 这个字段是前端->后端时用到的。
2.ExposeHeaders
字段 []string
对应 CORS 协议的 `Access-Control-Expose-Headers`
列出了响应报文哪些首部可以作为响应的一部分暴露给外部。
CORS请求时,XMLHttpRequest
对象的getResponseHeader()
方法只能拿到6个基本字段:
`Cache-Control`、
`Content-Language`、
`Content-Type`、
`Expires`、
`Last-Modified`、
`Pragma`
如果想拿到其他字段,就必须在Access-Control-Expose-Headers
里面指定。
- 这个字段是后端->前端用到的。
3.AllowOrigins
字段 []string
对应 CORS 协议的`Access-Control-Allow-Origin`
该字段是必须的。它的值要么是请求时Origin
字段的值,要么是一个*
,表示接受任意域名的请求。
Origin
用来说明,本次请求来自哪个源(协议 + 域名 + 端口)。服务器根据这个值,决定是否同意这次请求。
如果Origin
指定的源,不在许可范围内,服务器会返回一个正常的HTTP回应。浏览器发现,响应报文的头信息没有包含Access-Control-Allow-Origin
字段,就知道出错了,从而抛出一个错误,被XMLHttpRequest
的onerror
回调函数捕获。
注意,这种错误无法通过状态码识别,因为HTTP回应的状态码有可能是200。
4.AllowCredentials
字段 bool
对应 CORS 协议的`Access-Control-Allow-Credentials`
表示是否允许发送Cookie。
默认情况下,Cookie不包括在CORS请求之中。设为true
,即表示服务器明确许可 Cookie 可以包含在请求中,一起发给服务器。
这个值也只能设为true
,如果服务器不要浏览器发送Cookie,删除该字段即可。
5. AllowMethods
字段 []string
对应 CORS 协议的`Access-Control-Allow-Methods`
该字段必需,它的值是逗号分隔的一个字符串,表明服务器支持的所有跨域请求的方法。
注意,返回的是所有支持的方法,而不单是浏览器请求的那个方法。这是为了避免多次"预检"请求。
6. AllowHeaders
字段 []string
对应 CORS 协议的`Access-Control-Allow-Headers`
它也是一个逗号分隔的字符串,表明服务器支持的所有头信息字段,不限于浏览器在"预检"中请求的字段。
7. MaxAge
字段 time.Duration
对应 CORS 协议的 `Access-Control-Max-Age`
用来指定本次预检请求的有效期,单位为秒。在此期间,不用发出另一条预检请求。
8.关于预检请求
非简单请求是那种对服务器有特殊要求的请求,比如请求方法是PUT
或DELETE
,或者Content-Type
字段的类型是application/json
。
非简单请求的CORS请求,会在正式通信之前,增加一次HTTP查询请求,称为"预检"请求(preflight)。
浏览器先询问服务器,当前网页所在的域名是否在服务器的许可名单之中,以及可以使用哪些HTTP动词和头信息字段。只有得到肯定答复,浏览器才会发出正式的XMLHttpRequest
请求,否则就报错。