同源 & 跨域
同源
- 协议相同
- 域名相同
- 端口相同
- AJAX 不能跨域,只能同源
- WebSocket是一种通信协议,使用ws://(非加密)和wss://(加密)作为协议前缀, 不实行同源策略,在请求头中有一个
origin
字段, 即请求源(请求来自哪个),服务器根据这个字段可以判断是否许可,如该域名在白名单或黑名单中等。 - Cors: 跨源资源分享(Cross-Origin Resource Sharing),不同于JSONP只能发送GET请求,它可以发送各种类型的请求。
go的包:
github.com/gin-contrib/cors
Cors:
简单请求: HEAD / GET / POST 以及HTTP的header信息有限制包括。
而浏览器对于简单请求,直接发送Cors请求,即在头信息中添加了 origin
字段。如果服务器允许这次请求,则在响应报文中会添加以下字段:
1 | Access-Control-Allow-Origin: http://api.bob.com |
即 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包,就挺容易了,每个字段的作用是一摸一样的,就是改了个名儿。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Legendary!