同源策略
protocol,domain,port三者必须相同
同源限制
- 当前域下的 js 脚本不能够访问其他域下的 cookie、localStorage 和 indexDB。
- 当前域下的 js 脚本不能够操作访问操作其他域下的 DOM。
- 当前域下 ajax 无法发送跨域请求。
跨域方案
如果想深刻理解每个方案,推荐看以下两个链接,大佬写的非常详细,这里只重点排一下个人前端可能用的比较多的方案
前端面试题之浏览器原理篇 (yuque.com)--七、同源策略
1.jsonp
利用 html中的script src标签 加载其他源的数据
(href,src,link请求的图片、视频等都不存在跨域问题,经过ajax请求得数据才存在跨域问题)
<body>
<script type="text/javascript">
function f(data){
alert(data)
}
</script>
<script src="其他源?callback=f"></script>
</body>
优点:简单兼容性好
缺点:
- 仅支持get方法
- 不安全,可能遭受XSS攻击
2.cors 跨域资源共享
后台修改响应头Access-Control-Allow-Origin,开启CORS
- * 允许所有请求
- 域名,允许指定域名请求
发送请求分类
简单请求
复杂请求
非简单请求就是复杂请求,在正式通信之前,增加一次HTTP查询请求,称为"预检"请求,,该请求是 option 方法的,通过该请求来知道服务端是否允许跨域请求。
头信息必须要有的字段
- Access-Control-Request-Origin:
- Access-Control-Request-Method:列出浏览器的CORS请求会用到哪些HTTP方法
- Access-Control-Request-Header:是一个字符串,指定浏览器CORS请求会额外发送的头信息字段
3.h5 window.postMessage跨域
主流浏览器 ie8
可解决:
- 页面和其打开的新窗口的数据传递
- 多窗口之间消息传递
- 页面与嵌套的iframe消息传递
- 上面三个场景的跨域数据传递
4.框架(vue)中的跨域
使用proxy代理,本质上还是cors跨域
(项目中常用)