CORS跨域:跨域资源共享 cross-origin resource sharing
跨域资源共享——CORS
如果站点A允许站点B的脚本访问其资源,必须在http响应中显示的告知浏览器:站点B是被允许的
访问站点A的请求,浏览器应告知该请求来自站点B;
站点A的响应中,应明确哪些跨域请求是被允许的。
get / post / head 方法之一;
仅能使用cors安全的头部:Accept / Accept-Language / Content-Language / Content-Type (这些头部为内容协商式的头部,可以设置 Forbidden header name 中的头部字段,如 Connection
、Accept-Encoding
等,但是设置无效,设置其他头部则为复杂请求)
Content-Type值(访问的媒体类型)只能是:text/plain,multipart/form-data,application/x-www-form-urlencoded三者其中之一(除此之外的请求都为复杂请求,复杂请求和简单请求的跨域是完全不同的)
访问资源前,需要先发起prefight预检请求(方法为options)询问何种请求是被允许的
请求头中携带origin头部告知来自哪个域
响应中携带Access-Control-Allow-Origin头部表示允许哪些域
浏览器放行
通过Origin来告诉来自哪个域(在此处来自于Server-b),发送给Serve=>Serve回一个Access-Control-Allow-Origin允许哪些域进行访问
其实限制能不能进行同源访问全部在于Client,Serve不做任何限制的,即使不传入头部Serve也不会有问题的,也是会进行响应的,也就是说浏览器一定接收到了响应,但是如果Access-Control-Allow-Origin中指定的域名不是当前页面所匹配的域名的话,浏览器就不会去渲染相应的请求
复杂请求进行跨域请求的时候需要进行两步
第一步:Client => Server 预检请求
第二部:实际请求
Access-Control-Request-Method:后面实际发送请求的方法
Access-Control-Request-Headers:接下来将要发起实际复杂请求跨域访问时会使用到哪些头部
整个预检请求的方法必须是option方法
Access-Control-Allow-Methods:允许哪些方法去访问站点
Access-Control-Allow-Headers:允许哪些头部在后续的请求中去访问跨域请求
Access-Control-Max-Age:允许缓存的最长时间
origin = "Origin:"OWS origin-list-or-null OWS
origin-list-or-null = %x6E %s75 %x6c %x6c / origin-list 可以表示多个域
origin-list = serialized-origin *(SP serialized-origin)
serialized-origin = scheme "://" host [":"port] 域中可以含有scheme信息和host端口
在preflight预检请求中,告知服务器接下来的请求会使用哪些方法
在preflight预检请求中,告知服务器接下来的请求会使用哪些头部
在preflight预检请求的响应中,告知客户端后续请求允许使用的方法
在preflight预检请求的响应中,告知客户端后续请求允许携带的头部
在preflight预检请求的响应中,告知客户端响应的信息可以缓存多久
告知浏览器哪些响应头部可以共客户端使用,默认情况下只有Cache-Control,Content-Language,Content-Type,Expires,Last-Modified,pragma可供使用。
告知浏览器允许哪些域访问当前资源,*表示允许所有域。为避免响应错乱,响应中需要携带Vary:Origin
告知浏览器是否可以将Credentials暴露给客户端使用,Credentials包含cokkie、authorization类头部、TLS证书等。