「这是我参与11月更文挑战的第4天,活动详情查看:2021最后一次更文挑战」。
什么是CORS ( Cross-Origin Resource Sharing )
跨域资源共享,是一套组合拳,由一系列HTTP头组成,这些HTTP头组合决定浏览器是否允许客户端JS获取跨域请求的响应数据,同时也给web服务器选择是否允许资源被跨域请求。
CORS headers
-
Access-Control-Allow-Origin: 域白名单,决定哪些域可以访问资源;
-
Access-Control-Allow-Credentials: 决定是否响应 withCredentials 为 true即带Cookies的请求;
-
Access-Control-Allow-Headers 预请求的响应头,决定哪些HTTP头可以用在真正的请求头中;
-
Access-Control-Allow-Methods 预请求的响应头,决定正式请求可以使用哪些方法(GET, POST, PUT ...);
-
Access-Control-Expose-Headers 哪些头可以作为响应头;
-
Access-Control-Max-Age 预请求的返回可以被缓存的时长;
-
Access-Control-Request-Headers 预请求的请求头,告知服务器正式请求中哪些请求头会被使用;
-
Origin 预请求的请求头,告知服务器请求的来源;
当真正一个跨域请求发起时,浏览器会决定这个请求是简单请求还是复杂请求,简单请求则直接发起,复杂请求则需要发起一个预请求来询问服务器是否允许发送该请求。
简单请求
满足如下几点要求则为简单请求
-
GET HEAD 或者 POST
-
只自定义了Accept\Accept-Language\Content-Language\Content-Type这几种请求头
-
其中Content-Type只满足如下三种格式
-
application/x-www-form-urlencoded
-
multipart/form-data
-
text/plain
-
-
如果请求对象为XMLHTTPRequest类型,对象不能在upload事件上注册事件回调
-
请求中没有ReadableStream对象
复杂请求
没有满足简单请求的条件外的即为复杂请求,复杂请求会触发预检机制,
客户端会先发送一个OPTIONS方法的请求得到Access-Control-Requeset-Method等响应头判断是否能够成功发起请求,否则放弃发送正式请求,由于OPTIONS方法的请求不会改变服务器资源,所以预请求被认定是安全的。
如果预检请求返回了重定向,多大数浏览器是不支持对预检请求的重定向的,可以先发送一个简单请求,获取到重定向的URL,然后再发送正式请求。
参考