[ Go packages ]Cors 请求以及 "github.com/gin-contrib/cors"的使用

147 阅读3分钟

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字段,就知道出错了,从而抛出一个错误,被XMLHttpRequestonerror回调函数捕获。

    注意,这种错误无法通过状态码识别,因为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.关于预检请求

非简单请求是那种对服务器有特殊要求的请求,比如请求方法是PUTDELETE,或者Content-Type字段的类型是application/json

非简单请求的CORS请求,会在正式通信之前,增加一次HTTP查询请求,称为"预检"请求(preflight)。

浏览器先询问服务器,当前网页所在的域名是否在服务器的许可名单之中,以及可以使用哪些HTTP动词和头信息字段。只有得到肯定答复,浏览器才会发出正式的XMLHttpRequest请求,否则就报错。

相关链接

跨域资源共享 CORS 详解 - 阮一峰的网络日志 (ruanyifeng.com)