同源

  • 协议相同
  • 域名相同
  • 端口相同
  1. AJAX 不能跨域,只能同源
  2. WebSocket是一种通信协议,使用ws://(非加密)和wss://(加密)作为协议前缀, 不实行同源策略,在请求头中有一个 origin 字段, 即请求源(请求来自哪个),服务器根据这个字段可以判断是否许可,如该域名在白名单或黑名单中等。
  3. Cors: 跨源资源分享(Cross-Origin Resource Sharing),不同于JSONP只能发送GET请求,它可以发送各种类型的请求。

go的包:

github.com/gin-contrib/cors

Cors:

简单请求: HEAD / GET / POST 以及HTTP的header信息有限制包括。

而浏览器对于简单请求,直接发送Cors请求,即在头信息中添加了 origin 字段。如果服务器允许这次请求,则在响应报文中会添加以下字段:

1
2
3
4
Access-Control-Allow-Origin: http://api.bob.com
Access-Control-Allow-Credentials: true
Access-Control-Expose-Headers: FooBar
Content-Type: text/html; charset=utf-8

即 Acess-Control-* 之类的。

下面介绍这些字段:

  • Access-Control-Allow-Origin: 要么是请求时Origin字段的值,要么是一个 * ,表示接受任意域名的请求。

  • Access-Control-Allow-Credentials: true : 即是否加入cookie到请求中,这个字段不要不是设为false而是直接删除。如果要发送cookie则第一个字段不能设为 * 。

  • Access-Control-Expose-Headers : 设定你想要拿到的除了基本字段的其它字段值,如验证token的’athorization’

对于非简单请求:

在正式通信之前,增加一次HTTP查询请求,称为”预检”请求(preflight)。请求方法是OPTIONS,表示这个请求是用来询问的。

请求头的字段包括:

  • Access-Control-Request-Method : 即请求的方法
  • Access-Control-Request-Headers : 请求附加的字段

预检的服务器响应:

  • Access-Control-Allow-Method/Headers : 服务器允许的方法和信息字段。

  • Access-Control-Allow-Credentials : 与上相同

  • Access-Control-Allow-Max-Age : 一次预检的有效期

服务器许可的话也会返回包含 Access-Control-Allow-Origin 字段的信息,否则会报错。

看了这个之后,在看go的Cors包,就挺容易了,每个字段的作用是一摸一样的,就是改了个名儿。

阮一峰的博客