• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    PHP下ajax跨域的解决方案之jsonp实例分析

    本文实例讲述了PHP下ajax跨域的解决方案之jsonp。分享给大家供大家参考,具体如下:

    首先要说明一下json和jsonp的区别?

    json是一种基于文本的数据交换方式,或者叫做描述数据的一种格式。

    var person = {
      "name": "test",
      "age": "25",
      "sex": "男"
    };
    
    var data = [1, 2, 3, 4, 5];
    
    

    而jsonp是一种非官方跨域数据交互协议,该协议允许用户传递一个callback参数给服务端,然后服务端返回数据时会将这个callback参数作为函数名来包裹住json数据,这样客户端就可以随意定制自己的函数来自动处理返回数据了。

    比如我在a.com的网站上引用了b.com的一个b.js,但这样跨域的引用并不会产生错误,说明调用js文件时不受跨域的影响。

    script type="text/javascript" src="http://www.b.com/b.js">/script>
    
    

    那么我们在b.js里添加如下代码,看看是否能够执行

    alert("I from b");
    
    

    确定是可以执行。

    那么如果我们在a.com上自已创建一个js函数,而在b.com下的b.js中调用,那是否可行呢?

    a.com下的index.html如下:

    !DOCTYPE html>
    html>
    head>
      meta charset="UTF-8">
      title>/title>
    /head>
    body>
      script type="text/javascript">
        function a(data) {
          alert("I from a \r\n" + "data:" + data);
        }
      /script>
      script type="text/javascript" src="http://www.b.com/b.js">/script>
    /body>
    /html>
    
    

    b.com下的b.js如下:

    a("from b");
    
    

    上面也是可以执行的,我们可以看到在b.js中的数据确实正确的传到了函数a中。

    问题又来了,a.com中创建的函数名与b.js中调用的函数名必须一致,那么如何才能让b.com服务端知道这个函数名,只有通过地址栏来传递了,加上一个callback=函数名来传递。当然callback这个命名可以改,但大家都这么命名,也就约定俗成了。

    a.com下的index.html如下:

    !DOCTYPE html>
    html>
    head>
      meta charset="UTF-8">
      title>/title>
    /head>
    body>
      script type="text/javascript">
        function a(data) {
          alert("uid :" + data.uid + "name :" + data.name);
        }
      /script>
    
      !-- 注意这里把b.js改成b.php了 -->
      script type="text/javascript" src="http://www.b.com/b.php?callback=a">/script>
    /body>
    /html>
    
    

    b.com下的b.php如下:

    ?php
    $callback = !empty($_GET['callback']) ? trim($_GET['callback']) : '';
    
    if(!empty($callback)) {
      $data = json_encode(array(
        'uid' => 1,
        'name' => '测试',
      ));
    
      echo "{$callback}({$data});";
    }
    
    

    上面也是可以执行的,知道了回调函数名,b.com服务端处理好数据,然后通过字符串拼接输出。

    jquery中就已经提供了jsonp的支持,a.com下的index.html如下所示:

    !DOCTYPE html>
    html>
    head>
      meta charset="UTF-8">
      title>/title>
    /head>
    body>
      div class="info">/div>
      script type="text/javascript" src="http://www.b.com/jquery.js">/script>
      script type="text/javascript">
      $.ajax({
        dataType: "jsonp",
        url: "http://www.b.com/b.php",
        jsonp: "callback",
        success: function(data) {
          $(".info").text("uid:" + data.uid + " name:" + data.name);
        }
      });
      /script>
    /body>
    /html>
    
    

    跨域策略限制情况表如下:

    URL 说明 允许通信
    http://www.a.com/a.js
    http://www.a.com/b.js
    同一域名下 允许
    http://www.a.com/lab/a.js
    http://www.a.com/script/b.js
    同一域名下不同文件夹 允许
    http://www.a.com:8000/a.js
    http://www.a.com/b.js
    同一域名,不同端口 不允许
    http://www.a.com/a.js
    https://www.a.com/b.js
    同一域名,不同协议 不允许
    http://www.a.com/a.js
    http://127.0.0.100/b.js
    域名和域名对应ip 不允许
    http://www.a.com/a.js
    http://script.a.com/b.js
    主域相同,子域不同 不允许
    http://www.a.com/a.js
    http://a.com/b.js
    同一域名,不同二级域名(同上) 不允许
    http://www.a.com/a.js
    http://www.b.com/b.js
    不同域名 不允许

    更多关于PHP相关内容可查看本站专题:《PHP+ajax技巧与应用小结》、《PHP网络编程技巧总结》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》

    希望本文所述对大家PHP程序设计有所帮助。

    您可能感兴趣的文章:
    • ThinkPHP 5 AJAX跨域请求头设置实现过程解析
    • PHP Ajax跨域问题解决方案代码实例
    • 原生js实现ajax请求和JSONP跨域请求操作示例
    • PHP下ajax跨域的解决方案之window.name实例分析
    • 使用ajax跨域调用springboot框架的api传输文件
    • express如何解决ajax跨域访问session失效问题详解
    • Ajax跨域问题及解决方案(jsonp,cors)
    • Ajax解决跨域之设置CORS响应头实现跨域案例详解
    上一篇:php 实现账号不能同时登陆的方法分析【当其它地方登陆时,当前账号失效】
    下一篇:PHP ajax跨子域的解决方案之document.domain+iframe实例分析
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯

    时间:9:00-21:00 (节假日不休)

    地址:江苏信息产业基地11号楼四层

    《增值电信业务经营许可证》 苏B2-20120278

    PHP下ajax跨域的解决方案之jsonp实例分析 PHP,下,ajax,跨域,的,解决方案,