什么是同源策略
浏览器出于安全方面的考虑,只允许与本域下的接口交互。不同源的客户端脚本在没有明确授权的情况下,不能读写对方的资源。
本域指的是?
同协议:如都是http或者https
同域名:如都是http://jirengu.com/a 和http://jirengu.com/b
同端口:如都是80端口
如:
http://jirengu.com/a/b.js 和 http://jirengu.com/index.php (同源)
不同源的例子:
http://jirengu.com/main.js 和 https://jirengu.com/a.php (协议不同)
http://jirengu.com/main.js 和 http://bbs.jirengu.com/a.php (域名不同,域名必须完全相同才可以)
http://jiengu.com/main.js 和 http://jirengu.com:8080/a.php (端口不同,第一个是80)
需要注意的是: 对于当前页面来说页面存放的 JS 文件的域不重要,重要的是加载该 JS 页面所在什么域
什么是跨域?跨域有几种实现形式
从一个域名的网页去请求另一个域名资源,严格意义上讲只要协议 域名 端口有一个不同 就属于跨域
JSONP
CORS
降域
postMessage
JSONP 的原理是什么
我们会发现在html下引入外界地址的script标签是可行的,比如各种框架。那么也就是说同源策略并没有对script的src进行监测,而且script的特性是在页面加载时会访问script的src,那么我们可以将这个src想象成一个简单的get请求,通过访问这个地址,我们可以配合后端对路由进行参数配置,使这段访问的src中加入一些参数,从而灵活的从后端调取数据
CORS是什么
"跨域资源共享"(Cross-origin resource sharing)
它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制。
实现方式是,当你使用XMLHttpRequest发送请求时,浏览器发现该请求不符合同源策略,会给该请求加一个请求头:Origin,后台进行一系列处理,如果确定接受请求则在返回结果中加入一个响应头Access-Control-Allow-Origin; 浏览器判断该相应头中是否包含Origin 的值,如果有则浏览器会处理响应:,我们就可以拿到响应数据,如果不包含浏览器直接驳回,这时我们无法拿到响应数据。