跨域一
2015-07-20 14:11
169 查看
什么是跨域?
URL 说明 是否允许通信http://www.a.com/a.jshttp://www.a.com/b.js 同一域名下 允许 http://www.a.com/lab/a.jshttp://www.a.com/script/b.js同一域名下不同文件夹允许 http://www.a.com:8000/a.jshttp://www.a.com/b.js同一域名,不同端口不允许 http://www.a.com/a.jshttps://www.a.com/b.js同一域名,不同协议不允许 http://www.a.com/a.jshttp://70.32.92.74/b.js域名和域名对应ip不允许 http://www.a.com/a.jshttp://script.a.com/b.js主域相同,子域不同不允许 http://www.a.com/a.jshttp://a.com/b.js同一域名,不同二级域名(同上)不允许(cookie这种情况下也不允许访问) http://www.cnblogs.com/a.jshttp://www.a.com/b.js不同域名不允许
JSONP
原理:动态添加一个<script>标签,而script标签的src属性是没有跨域的限制的。缺点:只能实现get请求,不能实现post请求。
demo:
应为它用到的只是所有HTML元素中一个简单的script元素。看到这是不是觉得越发奇怪了?没关系,继续看下去就会茅厕(塞)顿开的,嘿嘿~来看个例子吧:
demo.html:
<!DOCTYPEhtml> <html> <head> <metahttp-equiv="Content-Type"content="text/html;charset=UTF-8"> <title>Demo</title> </head> <body> <scripttype="text/javascript"> functionsay(words){ alert(words); } </script> <scripttype="text/javascript"src="demo.js"></script> </body> </html>
demo.js:
say("Hello,everyone!");
运行demo.html文件后,是不是看到写着“Hello,everyone!”的警告框了?你可能会觉得这个例子很简单,没什么了不起的,甚至会在想:这和JSONP有关系吗?那么,我可以很肯定的告诉你:有关系!而且,这个例子实际上就是JSONP的原型!你也许会想到,JSONP不是访问远程数据的吗?对,试想一下,如果demo.js文件在其它域的服务器上呢?结果会不会出现问题?我也可以很负责的告诉你:不会!你可以将上面例子中的demo.js更改为:http://demo.hpyer.cn/php/jsonp.php?callback=say再试一下。
现在,聪明的你应该已经明白JSONP到底是怎么回事了,那么,再来解释一下本节开头第一句话吧。看过demo.js文件的内容,应该知道,其只是对一个函数(通常称之为:回调函数)的调用,而需要交互的数据则通过参数形势进行返回。所以通过JSONP访问的服务器需要提供一个可以设置回调函数名的接口,就像
<?php
$type=isset($_GET['type'])?$_GET['type']:'';
$callback=isset($_GET['callback'])?$_GET['callback']:'';
$json='';
if($type=='json'){
$json='{
"Image":{
"Width":800,
"Height":600,
"Title":"Viewfrom15thFloor",
"Thumbnail":{
"Url":"http://www.example.com/image/481989943",
"Height":125,
"Width":"100"
},
"IDs":[116,943,234,38793]
}
}';
}else{
$json='"Hello,everyone!"';
}
if(!empty($callback)){
$json=$callback.'('.$json.')';
}
echo$json;
jquery中的应用:
自1.2版本起,jQuery加入了对JSONP的支持。我们可以很容易的利用$.getJSON()方法(或者其它基于$.ajax()的方法),来跨域加载JSON数据。来个例子吧:
<!DOCTYPEhtml>
<html>
<head>
<metahttp-equiv="Content-Type"content="text/html;charset=UTF-8">
<title>Demo</title>
<scripttype="text/javascript"src="jquery.js"></script>
<scripttype="text/javascript">
functiondo_jsonp(){
$.getJSON("http://demo.hpyer.cn/php/jsonp.php?type=json&callback=?",
function(data){
$('#result').val('data.Image.IDs:'+data.Image.IDs);
});
}
</script>
</head>
<body>
<ahref="javascript:do_jsonp();">Clickme</a><br/>
<textareaid="result"cols="50"rows="5"></textarea>
</body>
</html>
你可能注意到上面的例子中,url被写成了
看我在项目中的一个例子:
//定义Ajax函数
functionajaxFun(){
vartimeStamp=Math.floor(newDate().getTime()/1000);
varurl="http://apiso.alidemo.3gpp.cn/httpserver/cp/yisou/ali_feedback_interface.php?callback=jsonpCallback&feedbacktype=add&type="+feedbackNumber+"&book="+me.mixedInfo.title+"&author="+me.mixedInfo.author+"&chapter="+me.mixedInfo.cname+"&chapterid="+me.mixedInfo.cid+"&questiondesc="+text+"&platform=1&t="+timeStamp+"&sn="+md5("d30fcd1a9f1900fa049b4766e0a275e1"+timeStamp);
varscriptObj=document.createElement("script");
scriptObj.src=url;
scriptObj.id="jsonpScript";
document.body.appendChild(scriptObj);
//jsonp回调函数,jsonpCallback必须为全局函数,因为jsonp返回的是在全局环境中执行函数的语句,即jsonpCallback(data)
window.jsonpCallback=function(data){
switch(data.code){
case"1":
novel.readerPrompt('提交成功,即将返回……',1,function(){
window.history.go(-1);
});
break;
case"0":
novel.readerPrompt('提交失败。',2);
break;
case"900":
novel.readerPrompt('提交失败,验证失败。',2);
break;
}
//成功后删除scriptObj,后面的setTimeout就不会执行了
if(document.getElementById("jsonpScript")){
document.body.removeChild(scriptObj);
}
}
//设置超时,超时的话直接显示提交成功
setTimeout(function(){
if(document.getElementById("jsonpScript")){
document.body.removeChild(scriptObj);
novel.readerPrompt('提交成功,即将返回……',1,function(){
window.history.go(-1);
});
}
},2000);
}
ajaxFun();
参考:
相关文章推荐
- 表单内容提交到数据库案例
- 【VBS】发邮件
- 二分查找
- 面试官最爱提的问题TOP10来自:北京人才市场报
- 在Linux中如何安装gcc
- 简单倒计时实现
- POJ 3279(Fliptile)题解
- centos6.5更改为163的yum源
- SrollView中嵌套GridView冲突
- 装箱问题
- CRM实施中应避免的5大问题
- wpa_supplicant适配层 -- 详解
- libevent入门篇
- 九度oj 1156
- JSON特殊字符的处理
- unity xml序列化与反序列化 多平台
- MeasureSpec学习 - 转
- POJ1523 SPF (无向图求割点)
- unity xml序列化与反序列化 多平台
- Delphi Randomize