同源策略、几种跨域方式

2017-02-24  本文已影响0人  周花花啊

概念

1、什么是同源策略?

2、什么是跨域,跨域有几种实现形式?

(2)、JSONP[JSON with Padding]

<!--不建议直接这样引用,我们可以将动态生成script标签封装成一个函数,每次使用的时候直接调用函数-->
<script src="//www.zhouhuahua.com/data.js?callback=onPrintData"></script>
<script>   
  //www.zhoupenghui.com请求www.zhouhuahua.com下面的数据    
  //首先定义一个函数,服务端生成的JS会调用并执行这个函数
  function onPrintData(data){        
        console.log(data);    
  }
  //封装一个生成script标签的函数   
  function printData(){       
        var script = document.createElement('script');       
        script.src = "//www.zhouhuahua.com/data.js?callback=onPrintData";
        document.body.appendChild(script);
  }    
  printData();
</script>
<!--用jquery实现jsonp调用-->
<script>
  $(function(){
    $.ajax({
      type: "get",
      url: "//www.zhouhuahua.com/data.js?callback=printData",
      dataType: "jsonp",
      jsonp: "callback",
      jsonpCallback: "printData",
      success: function(data){
        console.log(data);
      },
      error: function(){
        alert('fail');
      }
    });
  });
</script>

服务器端生成的JS文件:

onPrintData({    
    name: '周花花',    
    age: 22
});
跨域请求得到数据跨域请求得到数据

(3)、CORS[Cross-Origin Resource Sharing跨域资源共享]

<script>
    document.querySelector("#btn").addEventListener('click', function(){
        $.ajax({
            url: '//www.zhouhuahua.com/CORS.php',   //接口地址即请求地址
            type: 'get',   // 请求类型, post 或者 get, 
            data: {   //发送给后台的数据
                username: document.querySelector('#username').value
            }, 
            success: function(jsonData){   //响应成功(得到的数据可以是对的也可以是不对的,总之会有一个响应)执行这个函数
                var jsonObject = JSON.parse(jsonData);  //将后台传的字符串转换为JSON对象
                dealwith(jsonObject);  //这里的处理函数和上面的一样
            }, 
            error: function(){   //失败(没任何响应,比如服务器宕机了啥的)执行这个函数
                console.log('出错了') 
             } 
        });
    });
    function dealwith(userInfo){  //对解析出来的JSON对象操作
        //我们可以用从服务器拿到的数据,返回的数据是由后台给的字符串,所以我们还要写php
        var str = '<dt>性别:</dt>';
        str +=  '<dd>'+userInfo.sex+'</dd>';
        str += '<dt>年龄:</dt>';
        str +=  '<dd>'+userInfo.age+'</dd>';
        document.querySelector('#ct').innerHTML = str;
    }
</script>

服务端只要加一个响应头内容:

<?php   
    header("Access-Control-Allow-Origin:http://www.zhoupenghui.com");
    header('Content-Type:text/html;charset=utf-8');   
    $usename = $_GET['username'];   
    if($usename === 'kevin'){       
        $ret = array('sex'=>'男', 'age'=>23);   
    }else if($usename === 'david'){       
        $ret = array('sex'=>'男', 'age'=>30);   
    }else{       
        $ret = array('sex'=>'女', 'age'=>18);  
    }  
    echo json_encode($ret);
CORS跨域获取数据CORS跨域获取数据

(4)、HTML5 postMessage

<iframe id="ifr" src="//www.zhouhuahua.com/postMess.html" frameborder="1"></iframe>
<script>    
    window.onload = function(){        
        var ifr = document.getElementById("ifr");        
        var targetOrigin = 'http://www.zhouhuahua.com';
        ifr.contentWindow.postMessage('我是来自zhoupenghui.com的数据', targetOrigin);    
    }
</script>

b.com中代码:

<script>    
    window.addEventListener('message', function(event){        
        if(event.origin === 'http://www.zhoupenghui.com'){
            console.log('from:'+event.origin);            
            console.log('zhoupenghui传来的数据:'+event.data);        
        }    
    }, false);
</script>
postMessage跨源通讯postMessage跨源通讯

(5)、其他hack

3、jsonp的原理是什么?

2、CROS是什么?

练习

1、在本地搭建服务器,演示同源策略

参考:
JavaScript跨域总结与解决办法
说说json和jsonp
跨域资源共享 CORS详解

上一篇下一篇

猜你喜欢

热点阅读