一、 同源策略
同源策略(Same origin policy)是一种约定,它是浏览器最核心也是最基本的安全功能,如果缺少同源策略。则浏览器正常功能都会受到影响。
所谓同源是指,域名,协议,端口相同。
当一个浏览器的两个tab页中分别打开 百度和谷歌的页面,浏览器的百度tab页执行一个脚本的时候会检查这个脚本是属于哪个页面的,即检查是否同源,只有和百度同源的脚本才会被执行。
如果非同源,那么请求数据时,浏览器会在控制台中报一个异常,提示拒绝访问。
同源:域名、协议、端口相同,也就是在同一个域里。
非同源受到的限制
cookie不能读取dom无法获得ajax请求不能发送
二、 浏览器跨域
概念:
跨域问题来源于浏览器的同源策略,浏览器为了提高网站的安全性,在发送ajax请求时,只有在当前页面地址与请求地址的协议+域名+端口号相同时才允许访问,否则会被拦截。
例如:
-
比如我们现在常见的
http和https,如果当前页面地址使用http协议,请求的地址使用https协议,那么这个请求就存在跨域问题。 -
域名即网站网址,如
baidu.com,360.com存在跨域。 -
端口号即域名对应的服务器的监听端口,这个我们一般是看不到的,因为一般服务器都使用80端口,浏览器默认为80端口,所以不需要在域名后再写出端口号。当8080端口发出的请求为80端口时,也存在跨域。
三、解决跨域的方法
解决跨域的常用方法有两种:CORS(跨域资源共享),jsonp。
CORS
因为出于安全的考虑, 浏览器不允许Ajax调用当前源之外的资源. 即浏览器的同源策略.
CORS需要浏览器和服务器同时支持。目前,所有主流浏览器都支持该功能,IE浏览器不能低于IE10。在浏览器端, 整个CORS通信过程,都是浏览器自动完成,不需要用户参与。对于开发者来说,CORS通信与同源的AJAX通信没有差别,代码完全一样。浏览器一旦发现AJAX请求跨源,就会自动添加一些附加的头信息,有时还会多出一次附加的请求,用户对这些都不会有感觉。因此,实现CORS通信的关键是服务器。
jsonp
JSONP是通过script标签加载数据的方式去获取数据当做JS代码来执行- 提前在页面上声明一个函数,函数名通过接口传参的方式传给后台,后台解析到函数名后在原始数据上「包裹」这个函数名,发送给前端。换句话说,
JSONP需要对应接口的后端的配合才能实现。