zoukankan      html  css  js  c++  java
  • 跨域(三)——JSONP

    一、什么是JSONP?

    百度百科:JSONP(JSON with Padding)是JSON的 一种“使用模式”,可用于解决主流浏览器的跨域数据访问的问题。由于同源策略,一般来说位于 server1.example.com 的网页无法与不是 server1.example.com的服务器沟通,而 HTML 的<script> 元素是一个例外。利用 <script> 元素的这个开放策略,网页可以得到从其他来源动态产生的 JSON 资料,而这种使用模式就是所谓的 JSONP。用 JSONP 抓到的资料并不是 JSON,而是任意的JavaScript,用 JavaScript 直译器执行而不是用 JSON 解析器解析。

    二、JSONP的实现思路很简单

    1、前端创建script标记,设置src,添加到head中(当然也可以往body中添加)。

    2, 后台返回一个js变量jsonp,这个jsonp就是请求后的JSON数据。

    3, 回调完成后删除script标记(还有一些清理工作如避免部分浏览器内存泄露等)。

    三、简单代码例子

    服务器端:

    <?php
    $obj=array('chicken'=>2,'duck'=>3);//$ob是待传递对象
    $callback=$_GET['callback'];//获取传入的函数名
    if(!$callback){
        $callback='jsoncallback';//如果没传入就使用的默认函数名
    }
    //输出一段JS格式的代码,调用用传入的函数名,参数为需要传递的$obj对象
    echo "alert('我是小偷,哈哈');".$callback.'('.json_encode($obj).');';
    ?>

    客户端:

    <div><span id="chicken"></span><br/><span id="duck"></span></div>
    <script type="text/javascript">
    //回调函数定义
    function mycallback(obj){
      //输出传递过来的对象
      document.getElementById('chicken').innerHTML=obj.chicken;
      document.getElementById('duck').innerHTML=obj.duck;
    };
    
    window.onload=function(){
      //创建SCRIPT标签
      var script=document.createElement("script");
      //设置URL
      script.src="http://127.0.0.1:8081//langtao/steal.php?callback=alert('我是强盗');mycallback";
      //把标签放入文档中以便生效
      document.body.appendChild(script);
      document.body.removeChild(script);
    };
    </script>
    
    <!--<script>
    $.ajax({
    dataType:'jsonp',
    data:'id=1',
    jsonp:'callback',
    url:'http://127.0.0.1:8081//langtao/steal.php',
    success:function(obj){
        document.getElementById('chicken').innerHTML=obj.chicken;
        document.getElementById('duck').innerHTML=obj.duck;
    },
    });
    </script>-->
    
    <!--<script>
    $.getJSON(
      "http://127.0.0.1:8081//langtao/steal.php?callback=?",
      function(obj){
        document.getElementById('chicken').innerHTML=obj.chicken;
        document.getElementById('duck').innerHTML=obj.duck;
      }
    );
    </script>-->

    四、安全问题

    JSONP虽然易于实现,但是也会存在一些安全隐患,如果第三方的脚本随意地执行,那么它就可以篡改页面内容,截获敏感数据。但是在受信任的双方传递数据,JSONP是非常合适的选择。

  • 相关阅读:
    ElasticSearch——分页查询
    Canal——写入到ES中数据错乱
    HBase管理与监控——WebUI
    '$.browser.msie' 为空或不是对象
    input file 获取不到Request.Files 解决办法
    .NET读取服务器或本地文件
    .NET将服务器文件导出
    .Net 中HashTable,HashMap 和 Dictionary<key,value> 和List<T>和DataTable的比较
    JavaScript跨域调用基于JSON的RESTful API
    WCF项目问题2-无法激活服务,因为它需要 ASP.NET 兼容性。没有未此应用程序启用 ASP.NET 兼容性。请在 web.config 中启用 ASP.NET 兼容性,或将 AspNetCompatibilityRequirementsAttribute.AspNetCompatibilityRequirementsMode 属性设置为 Required 以外的值。
  • 原文地址:https://www.cnblogs.com/aaron-shu/p/4170304.html
Copyright © 2011-2022 走看看