用的是jsonp:实质上跨域的处理是存在2种一种是jQuery中对跨域的处理,一种是js中对跨域的处理
json是一种轻量级的数据交换格式,而jsonp(json with padding)则是json的一种使用模式
jsonp跨域原理
【在同源策略下,在某个服务器下的页面是无法获取到该服务器以外的数据的,单img,script等标签是个例外,这些标签可以通过src属性请求到其他服务器上的数据,利用script标签的开放策略,可以实现跨域请求的数据。跨域是指:跨域名、跨端口、跨协议。指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对javaScript施加的安全限制。】
1:在jquery中如何通过jsonp来处理跨域获取数据?
方法一:在ajax函数中设置data的类型为jsonp即:
$.ajax({
datatype:"jaonp",
url:'',
})
使用jsonp解决跨域虽然简单,但是安全性问题仍然存在着隐患,要确定jsonp请求是否失败并不容易
2:js处理跨域获取数据的方式有3种:
一:基于iframe的
demo1.html页面
document.domain = 'aaa.com';
function a(){
alert('');
}
<iframe src="***/demo2.html" id='q'></iframe>
document.getElementById('q').onload = function(){
var e=document.getElementById('q').comtentWindow;
e.bbb();
}
demo2.html页面
document.domain = 'aaa.com'
function bbb(){
alert('处理一些事情');
}
此时demo1.html里面就可以调用bbb函数了。。。。
二:web sockets
虽然他是一种浏览器的api,他的目标是在一个单独的持久的链接上面提供全双工、双向通信,但是同源策略对ta 不适用
此数据的获取,只有在支持他的协议的服务器上面才能正常工作。
【原理:js创建web socket之后,会有一个http请求发送到浏览器,发送链接,服务器相应之后,建立的链接会使http转换成web scoket协议 】
var socket = new WebSocket('aa://www.baidu.com');【http-->aa;https--->aaa】
socket.send('哈哈哈哈哈);
socket.onmessage = function(event){
var data = event.data;
}
javascript跨域通信
同源:两个文档同源需满足
- 协议相同
- 域名相同
- 端口相同
跨域通信:js进行DOM操作、通信时如果目标与当前窗口不满足同源条件,浏览器为了安全会阻止跨域操作。跨域通信通常有以下方法
- 如果是log之类的简单单项通信,新建
<img>
,<script>
,<link>
,<iframe>
元素,通过src,href属性设置为目标url。实现跨域请求 - 如果请求json数据,使用
<script>
进行jsonp请求 - 现代浏览器中多窗口通信使用HTML5规范的targetWindow.postMessage(data, origin);其中data是需要发送的对象,origin是目标窗口的origin。window.addEventListener(‘message’, handler, false);handler的event.data是postMessage发送来的数据,event.origin是发送窗口的origin,event.source是发送消息的窗口引用
- 内部服务器代理请求跨域url,然后返回数据
- 跨域请求数据,现代浏览器可使用HTML5规范的CORS功能,只要目标服务器返回HTTP头部
Access-Control-Allow-Origin: *
即可像普通ajax一样访问跨域资源