1. 什么是同源策略
浏览器出于安全方面的考虑,只允许与本域下的接口交互。不同源的客户端脚本在没有明确授权的情况下,不能读写对方的资源。
本域指的是?
同协议:如都是http,https,file,ssh,mailto,tel
同域名(在//后到第一个/之间):如都是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 页面所在什么域
2. 什么是跨域?跨域有几种实现形式
跨域顾名思义就是突破同源策略的限制,去不同的域下访问数据。
主要有如下几种实现形式:
JSONP:引入script标签设置src所需要的资源,之后删除。
CORS : 在后端的返回头部设置Access-Control-Allow-Origin设置成指定的访问地址。
降域: 2者要设置document.domain='"' 访问的前后都要降域并且2者都要有同一个基础域名。
passMessage : window下的一个方法,window.passMessage(值,传递的地址)
3. JSONP 的原理是什么
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,而JSONP(JSON with Padding)则是JSON 的一种“使用模式”,通过这种模式可以实现数据的跨域获取。 在同源策略下,在某个服务器下的页面是无法获取到该服务器以外的数据的,但img、iframe、script等标签是个例外,这些标签可以通过src属性请求到其他服务器上的数据。利用script标签的开放策略,我们可以实现跨域请求数据,当然,也需要服务端的配合。当我们正常地请求一个JSON数据的时候,服务端返回的是一串JSON类型的数据,而我们使用JSONP模式来请求数据的时候,服务端返回的是一段可执行的JavaScript代码。
4. CORS是什么
CORS跨域资源共享,Cross-Origin-Resource-Sharing,是一种ajax跨域请求资源的方式。
1、使用XMLHttpRequest发送请求时,浏览器发现该请求不符合同源策略,会给该请求加一个请求头:origin
2、后台进行处理,确定接收请求则在返回结果中加入一个响应头:Access-Control-Allow-Origin
3、浏览器判断该响应头中是否包含Origin的值,如果有,浏览器处理响应,我们拿到响应数据;如果没有,浏览器直接驳回,我们无法拿到响应数据
PS:CORS的表象是让你觉得它与同源的ajax请求没啥区别,代码完全一样
使用 CORS 跨域的时候其实和普通的 ajax 过程是一样的,只是浏览器在发现这是一个跨域请求的时候会自动帮我们处理一些事,比如验证等等,所以说只要服务端提供支持,前端是不需要做额外的事情的。