JavaScript的同源策略是什么?
如果两个页面拥有相同的协议(protocol),端口(如果指定),和主机,那么这两个页面就是属于同一个源
览器有一个很重要的概念——同源策略(Same-OriginPolicy)。所谓同源是指,域名,协议,端口相同。不同源的客户端脚本(javascript、ActionScript)在没明确授权的情况下,不能读写对方的资源。
简单的来说,浏览器允许包含在页面A的脚本访问第二个页面B的数据资源,这一切是建立在A和B页面是同源的基础上。
如果Web世界没有同源策略,当你登录FreeBuf账号并打开另一个站点时,这个站点上的JavaScript可以跨域读取你的FreeBuf账号数据,这样整个Web世界就无隐私可言了。
同源:协议、域名、端口全部相同才是同源,考虑到安全性,不同源之间不能够进行数据通信
解决不同源通信问题:
①通过iframe,虽然iframe属性中sandbox将安全性提升到了最高,但是我们可以通过他的不同的属性值开放
不同的安全方面的限制。通过allow-same-origin以及allow-scripts开放出来对不同源之间数据的传递以及
cookie或localstorage的信息共享
②在Ajax使用方面,不同源意味着发送请求出现Access-Control-Allow-Origin访问拒绝的提示,解决办法如
下:
如果服务器方是我们自己的,那么可以通过跨域资源共享(CORS)来进行设置请求头Access-ControlAllow-Origin:域名或者*来进行开发这部分权限,达到不同源的数据共享
如果服务器是别人的,我们可以通过proxy来实现桥接,首先我们和自己的服务是同源的,那么我们携带
请求的URL及参数,同源服务器进行代理请求,处理数据,然后返回给我们自己,实现不同源之间的数据共享
script标签的src属性特性是不同源照样可以下载进行页面加载,我们可以通过动态添加script方式,携带一个回调函数名,并在script中提前把这个回调函数写好,将请求发送到不同源的服务端,服务端返回这个
没有经过执行的回调函数,中间包含我们需要的数据,当返回客户端的时候,我们提前写好的回调函数直接调
用,即可获取到不同源之间返回的数据,实现资源共享
③通过window.name来进行跨域,在一个窗口的生命周期内,窗口载入的所有页面共享一个window.name
④通过H5新增的新特性postMessage()来进行跨域窗口处理数据