为什么会有带options的请求?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
ajax请求遵守通源策略(相同协议/域名/端口),跨域需遵守CORS机制,带预检的跨域请求(Preflighted Request-发送带options的请求为预请求)
为试探服务器能否接受真正的请求。
简单请求
1.请求方法是 GET/HEAD/POST
2.HTTP头信息不超出 Accept/Accept-Language/Content-Language/Last-Event-ID
3.Content-type只限于 application/x-www-form-urlencoded、multipart/form-data、text/plain
非简单请求(预检请求-Preflighted Request)
1.请求方法不是 GET/HEAD/POST
2.POST请求的Content-Type并非 application/x-www-form-urlencoded、multipart/form-data、text/plain
3.请求设置了自定义的header字段
简单请求,浏览器直接发出CORS请求,在头部加一个Origin字段(Origin: http://api.bob.com)
服务器根据Origin字段识别是否在允许范围内,若在范围内,返回Access-Control-开头三个字段,否则浏览器抛出错误;
非简单请求,浏览器会先发出预检请求,即请求方法为Options,包括:Access-Control-Request-Method,Access-Control-Request-Headers
服务器对此作出判断,返回对应字段,一旦服务器通过预检请求,随后的每次浏览器发出的CORS请求就变成简单请求,带Origin字段,
服务器则给出Access-Control-Allow-Origin字段
CORS与JSONP对比
1
2
3
4
相同:目的一致,都是为了解决跨域问题
不同:
1.Jsonp只支持get请求,更兼容于老式浏览器
2.Cors支持所有请求方法