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 允许访问的方法

  • 相关阅读:
    课堂作业04 2017.10.27
    课程作业 03 动手动脑 2017.10.20
    课程作业 03 2017.10.20
    HDU 3974 Assign the task
    POJ 2155 Matrix
    POJ 2481 Cows
    HDU 3038 How Many Answers Are Wrong
    CS Academy Array Removal
    POJ_1330 Nearest Common Ancestors LCA
    CF Round 427 D. Palindromic characteristics
  • 原文地址:https://www.cnblogs.com/phpfans/p/2125258.html
Copyright © 2011-2022 走看看