同源,跨域,JSONP原理剖析

同源和跨域这两个名词一直是相对存在的。

同源:

同源策略是浏览器的一种安全策略,所谓同源是指,域名,协议,端口完全相同。

跨域:

不同源则为跨域,跨域不允许进行DOM操作,也不允许发送ajax。

 *关于同源和跨域大家可以看下面这张表,相信可以很清晰的理解。


 跨域方案

    1、顶级域名相同的可以通过domain.name来解决,即同时设置 domain.name = 顶级域名(如example.com)

    2、document.domain+ iframe3、window.name+ iframe

    4、location.hash+ iframe

5、window.postMessage()

以上几种方案都是只能在某一特定情形下使用,兼容性和实用性都不太好,大家可以只做了解,而我们一般跨域都是用JSONP去实现

也许大家现在对跨越感觉还是比较陌生,但我相信,在之前的开发学习过程中肯定也发送过跨域请求。

<a href="http://www.baidu.com">我的百度</a>
<img src="https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=1105037253,1131367531&fm=27&gp=0.jpg" alt="">

这两个标签相信大家都不陌生,然而现在已经实现了跨域,也许看到这里你会焕然大悟,利用a标签的href属性,和img标签的src属性,没关系如果不明白,我们继续往下看。

这两个标签都有天然的跨域特性,所以跨域的实现跟他们少不了关系

src:   img标签

href: a标签  script标签

仔细回想一下在以往开发过程中,有没有用过script 去引用网上的资源?我们接下来就利用script标签src的天然跨域特性来实现跨域操作。

首先我们先写一个名为corss的php页面用来传递数据,(关于php的知识大家可以看我关于php的博客)

<?php   ---- php代码需要包裹在其中
    echo "abc"; // echo 是php中的输出语句,相当于javascript中的 console.log(“abc”);
?>    ---- php代码需要包裹其中

接着我们创建一个html页面, 添加一对script 标签,src请求路径为上面的php文件

<script src="corss.php"></script>

然后在浏览器打开html页面控制台会报这样一个错。


你也许会想abc is not defined  什么鬼?

因为我们是使用script标签来发送请求的,所以返回的默认值会以script所支持的javascript请求来解析。

为了验证上面这句话,看看返回的结果是不是真的会以javascript的语法来解析,我们来更改一下php页面返回的值.

<?php
    echo "alert(123)"; // 如果返回值按照javascript的语法解析,那么运行html将会出现一个弹出框显示123
?>

果然没有出乎我们的意料 

好接下来我们便利用这一特性在做一些更改,

首先我们在html页面定义一个函数,并把函数名通过拼接url请求php页面

   <script>
        function fn() {
            console.log("能不能打印输出呢?");
        }
    </script>  
    <script src="corss.php?callBack=fn"></script> // 通过url拼接参数方式把函数名发送给后台

php页面呢,只需接受html页面传递的函数名,并通过字符串拼接的方式,返回函数的调用。

<?php
    $callBack = $_GET["callBack"]; // 获取html页面传递的数据,此时$callBack 就是 fn 
    echo $callBack."()";  // . 是php 中字符串拼接的方法,等同于javascript中的  fn + "()"
?>

运行html页面看能否输出打印?

显然是可行的。


到了现在我们可以真正的去实现一个基本的跨域请求数据了,具体请看下面代码。

html页面

  <script>
        function fn(data) { // 我们通过data 来接收后台传递的数据
            console.log(data); 
        }
    </script>  
    <script src="corss.php?callBack=fn"></script>

php页面

<?php
    $callBack = $_GET["callBack"]; // 获取html页面传递的数据,此时$callBack 就是 fn 
    $data = file_get_contents("nav.json"); // php 读取文件内容方式, $data 中存储的就是我们需要的数据
    echo $callBack."(".$data.")";  // . 是php 中字符串拼接的方法 
?>

php后台部分,返回函数调用形式,并把读取json文件中数据以参数的形式返回给前端。

html前端部分,先通过url拼接参数把实现定义好的函数名发送给后台。

执行结果如下


这样我们就可以很轻而易举实现跨域并拿到后传递的数据。

猜你喜欢

转载自blog.csdn.net/zero________________/article/details/80792394