CORS全称Cross-Origin Resource Sharing, 即跨域资源共享,是一个由一系列HTTP头组成的系统,这些HTTP头决定浏览器是否阻止前端javascript
代码获取跨域请求的响应。为什么需要CORS ? 这是因为浏览器存在同源安全策略,当我们在当前域请求另外一个域的资源时,浏览器默认会阻止脚本读取它的响应,这时CORS就有了用武之地。
同源策略
同源策略是浏览器的一个重要的安全策略,它用于限制一个源的文档或其加载的脚本如何与另外一个源进行交互,它能够隔绝恶意文档,减少被攻击的媒介。
同源的定义
如果两个URL的协议、主机名和端口号都是相同的,那么这两个URL就是同源的,
下表给出了与 URL http://store.company.com/dir/page.html 的源进行对比的示例:
URL | 结果 | 原因 |
---|---|---|
http://store.company.com/dir2/other.html | 同源 | 只有路径不同 |
https://store.company.com/secure.html | 非同源 | 协议不同 |
http://store.company.com:81/dir/etc.html | 非同源 | 端口号不同 |
http://news.company.com/dir/other.html | 非同源 | 主机名不同 |
也就是说当在http://store.company.com/dir/page.html
这个网站中向https://store.company.com
、http://store.company.com:81
和http://news.company.com
三个地址发起AXJX
请求都会失败并且会报跨域的错误。这就是浏览器的同源策略,只能访问同源的数据。
源的修改
实际上,在一个源下可以修改当前源,比如在http://hello.word.com/index.html
下,有一个脚本执行了以下语句:
document.domain = 'word.com'
那么当前网站能与http://word.com
通过同源检测,即允许访问http://word.com
的数据。需要注意的是document.domain
只能设置为当前域的父域, 并且在设置之后,端口号会变成null,例如还是在http://hello.word.com/index.html
下执行以下语句会失败:
document.domain = 'hello2.word.com'
跨源网络访问
事实上,不是所有跨源操作都被禁止。跨源操作主要分为三大类,跨源写操作、跨源资源嵌入和跨源读操作。
- 跨源写操作一般是被允许的。如超链接、重定向、表单提交。
- 跨源资源嵌入一般也是被允许的。如嵌入
<img />
、<video />
、<audio />
等。 - 跨源读操作不被允许,要实现跨源读操作,可以使用JSONP或CORS。
跨源访问
跨域(跨源)的解决方案主要有两种,JSONP
和CORS
, 当然还可以是代理或者反代理的手段。
JSONP
JSONP
是一种hack
,并不是一种官方解决跨域的手段,JSONP只能进行GET
请求。它主要是利用<script>
标签来发起请求,来达到突破浏览器同源策略的目的。
<html>
<head>