持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第13天,点击查看活动详情
前情提要:非简单请求是那种对服务器有特殊要求的请求,比如请求方法是PUT或DELETE,或者Content-Type字段的类型是application/json
特别之处:什么是预检请求
非简单的CORS请求,会在正式通信前,增加一次HTTP 查询请求,主要是为了确认当前网页所在域名是否在许可名单里&可以加HTTP哪些头信息字段
让我们来模仿走一遍吧!
举例:
1、浏览器脚本里有HTTP请求
var url = 'http://api.alice.com/cors';
var xhr = new XMLHttpRequest();
xhr.open('PUT', url, true);
xhr.setRequestHeader('X-Custom-Header', 'value');
xhr.send();
//举例参考:http://www.ruanyifeng.com/blog/2016/04/cors.html
2、这时候浏览器发现,诶,这是一个非简单请求,因为HTTP请求用的是PUT 那么,就需要自动发一个“预检请求”
3、发送预检请求
OPTIONS /cors HTTP/1.1
Origin: http://api.bob.com
Access-Control-Request-Method: PUT
Access-Control-Request-Headers: X-Custom-Header
Host: api.alice.com
Accept-Language: en-US
Connection: keep-alive
User-Agent: Mozilla/5.0...
//举例参考:http://www.ruanyifeng.com/blog/2016/04/cors.html
"预检"请求用的请求方法是OPTIONS,表示这个请求是用来询问的。头信息里面,关键字段是Origin,表示请求来自哪个源。
我们发现"预检"请求的头信息有包括两个特殊字段。
(1)Access-Control-Request-Method
用来列出浏览器的CORS请求会用到哪些HTTP方法(举例里说的是PUT
(2)Access-Control-Request-Headers
4、确认回应
服务器收到预检,并检查了字段之后,就确认可以允许啦,并发送回应
5、否定回应
如果否定,不允许呢?
如果服务器否定了"预检"请求,会返回一个正常的HTTP回应,但是没有任何CORS相关的头信息字段
浏览器就会认定,服务器不同意预检请求,因此触发一个错误
写在最后
重新开始更文啦!最近忙了一段时间,终于继续可以学习!感谢大家的支持!我会继续努力坚持学习!养成了好习惯,每天必定会抽出时间多多少少学习前端知识~
以上习题&笔记从大佬们的论坛学习而来,特感谢大佬们的知识分享~ (学习技术知识,果然要看大佬们的技术博客,大家有好的推荐也欢迎指引我这个小白哈,感恩!)
附上学习链接,感谢这些大佬出题和解答: