一、JSONP是一種較為規(guī)范和通用的解決ajax跨域訪問(wèn)限制的方式
二,、ajax跨域訪問(wèn)限制:基于安全的原因,,瀏覽器采用同源策略,其阻止從一個(gè)源加載的文檔或腳本獲取或設(shè)置另一個(gè)源加載的文檔,;所謂同源要求域名和端口全部一致,,例如
1.example.com 和2.example.com 就非同源,example.com:80 和 example.com:8080 亦非同源,。
三,、jsonp的原理:帶有src屬性標(biāo)簽的跨域資源獲取能力,在jsonp中通常使用<script>標(biāo)簽,,因?yàn)?lt;script>標(biāo)簽獲取的跨域資源可以使用回調(diào)函數(shù)直接處理
jsonp的實(shí)現(xiàn):
前端代碼:
- <script>
- function callback(data){
- console.log(data);
- }
- </script>
- <script type="text/javascript" src="http://www.remote.com/remote.php?callback=callback"></script>
后臺(tái)代碼 <www.remote.com/remote.php>
- if(isset($_GET["callback"])){
- $server_name = $_SERVER["SERVER_NAME"];
- $path = $_SERVER["PHP_SELF"];
- $query_string = $_SERVER["QUERY_STRING"];
- if($query_string!=""&&$query_string!=null){
- $query_paras = explode("&", $query_string);
- $query_array = array();
- $query_length = count($query_paras);
- for($i=0;$i<$query_length;$i++){
- $paras = explode("=", $query_paras[$i]);
- $query_array[$paras[0]]=$paras[1];
- }
- $data = array("server_name"=>$server_name,"path"=>$path,"query_paras"=>$query_array);
- }else{
- $data = array("server_name"=>$server_name,"path"=>$path);
- }
- $callback = $_GET["callback"];
- echo $callback . "(" . json_encode($data) . ")";
后臺(tái)服務(wù)器將需要返回的json數(shù)據(jù)進(jìn)行封裝,,然后并不直接返回json,而是返回一句js代碼,,
- echo $callback . "(" . json_encode($data) . ")";
這句代碼將返回的json數(shù)據(jù)調(diào)用回調(diào)函數(shù)直接進(jìn)行處理
四,、zepto實(shí)現(xiàn)jsonp
- function getData(){
- $.ajax({
- type: 'GET',
- url: '//www.homeworksong.sinaapp.com/getUrlInfo.php?callback=?',
- timeout: 300,
- context: $('tbody'),
- data: { name: 'Zepto',type:"JSONP" },
- success: function(data){
- console.log(data);
- },
- error: function(xhr, type){
- alert('Ajax error!')
- }
- });
- }
五、kissy實(shí)現(xiàn)jsonp
- require(["io","node","util"],function(IO,$,Util){
- IO.jsonp("http://www.homeworksong.sinaapp.com/getUrlInfo.php",{type:"JSONP",name:"Kissy" },function(data){
- console.log(data);
- });
- });
- });
|