zoukankan      html  css  js  c++  java
  • JSONP解决跨域获取数据

    1、什么是JSONP?

    要了解JSONP,不得不提一下JSON,那么什么是JSON

    JSONP(JSON with Padding)是一个非官方的协议,它允许在服务器端集成Script tags返回至客户端,通过javascript callback的形式实现跨域访问(这仅仅是JSONP简单的实现形式)。

    2、JSONP有什么用?

    由于同源策略的限制,XmlHttpRequest只允许请求当前源(域名、协议、端口)的资源,为了实现跨域请求,可以通过script标签实现跨域请求,然后在服务端输出JSON数据并执行回调函数,从而解决了跨域的数据请求。

    3、如何使用JSONP?

    下边这一DEMO实际上是JSONP的简单表现形式,在客户端声明回调函数之后,客户端通过script标签向服务器跨域请求数据,然后服务端返回相应的数据并动态执行回调函数。

    HTML

    <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
    <script type="text/javascript">
        function jsonpCallback(result) {
            alert(result.a);
            alert(result.b);
            alert(result.c);
            for(var i in result) {
                alert(i+":"+result[i]);//循环输出a:1,b:2,etc.
            }
        }
    </script>
    <script type="text/javascript" src="http://crossdomain.com/services.php?callback=jsonpCallback"></script>

    PHP

    <?php
    //服务端返回JSON数据
    $arr=array('a'=>1,'b'=>2,'c'=>3,'d'=>4,'e'=>5);
    $result=json_encode($arr);
    //echo $_GET['callback'].'("Hello,World!")';
    //echo $_GET['callback']."($result)";
    //动态执行回调函数
    $callback=$_GET['callback'];
    echo $callback."($result)";

    以下方法用jquery实现

    HTML

    <script type="text/javascript" src="jquery-1.6.2.min.js"></script>
    <script type="text/javascript">
    function test() {
        $.ajax({
            url: ' http://test.com/jsonp/test.php',
            type: 'GET',  //这里用GET
            async: false,
            data:{uid: 1, opt: 2},
            dataType: 'jsonp',  //类型
            jsonp: 'callback', //jsonp回调参数,必需
            success: function(result) {
                alert(result.message); //回调输出
            }
        });
    }
    test();
    </script>

    PHP

    <?php
    header("Access-Control-Allow-Methods: GET,POST");
    header("Access-Control-Allow-Headers: x-requested-with,content-type");
    header("Access-Control-Allow-Origin: http://blog.beidafuxiao.cn");
    $callback = isset($_GET['callback']) ? trim($_GET['callback']) : ''; //jsonp回调参数,必需 $data= '{"message":"test"}'; //json 数据 echo $callback . '(' . $data .')'; //返回格式,必需 ?>

    总结:jsonp就是利用了script标签的跨域能力,实现站点跨域访问的

    只有当目标页面的response中,包含了 Access-Control-Allow-Origin 这个header,并且它的值里有我们自己的域名时,浏览器才允许我们拿到它页面的数据进行下一步处理。如:Access-Control-Allow-Origin: http://run.jsbin.io
    如果它的值设为 * ,则表示谁都可以用:
    Access-Control-Allow-Origin: *
    没错,在产品环境中,没人会用 *

    Access-Control-Allow-Methods 允许访问的方法

  • 相关阅读:
    Postfix之mail.cf
    利用 Postfix 抵擋垃圾信
    安装webmin
    Win7 登入提示临时漫游档案
    squid 延伸
    禁止VMware用户在系统里删除网卡的操作的方法
    Squid Proxy Server 3.1
    使用RBL拦截垃圾邮件
    建置 POSTFIX 服务器
    Seednet 访问路径
  • 原文地址:https://www.cnblogs.com/phpfans/p/2125258.html
Copyright © 2011-2022 走看看