zoukankan      html  css  js  c++  java
  • JSONP是个嘛玩意?解决跨域问题?

    浏览器同源策略

    限制js向 其他域名发起请求,浏览器调试报错如下

     

     JSONP 是一种解决方法

    浏览器不会阻止带有src属性的标签发请求。所以可以常用的 <script src="xxxxx"></script> 来发请求

    但是:返回的数据(字符串)需要符合js的语法。而服务端则专门做了支持。比如就返回 functionName(arg...)

    这种方案就称为JSONP

    例如某电视台查询最近节目单的接口就做了支持:

    http://www.jxntv.cn/data/jmd-jxtv2.html?callback=list&_=1454376870403
    接口返回字符串:list({data:[xxxx......]})
    这个字符串放到js里面就可以解析为可以执行的动作,并且参数包含了服务端想提供给客户端的数据,前端只要有list这个js函数就可以对获取到的数据自行处理

    例:普通js 创建<scrript src='' ></script> 标签

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <script src="/static/jquery-2.2.3.min.js"></script>
    </head>
    <body>
        <h1>从后台获取结果</h1>
        {{ result }}
        <h1>前端js直接向其他域名发起get请求</h1>
        <input type="button" value="点击发起js请求" onclick="getContent();"/>
        <div id="container"></div>
    </body>
        <script>
            function getContent(){
                //////////普通js发起jsonp////////////////
                // 利用js向查询天气接口发请求,接口返回的为js 的函数字符串,并且在函数中传参
                // 浏览器不会阻止 带有src 属性的标签发get请求,从而实现跨域请求
                let tag = document.createElement('script');
                tag.src = 'http://www.jxntv.cn/data/jmd-jxtv2.html?callback=list&_=1454376870403';
                document.head.appendChild(tag);
                // 向浏览器增加元素后,含有src属性会立即发送get请求到目标网站
                // 返回数据为符合js语法的函数:如list({data:[({data:xxx,,,,,,,)自己的js中必须提前创建好这个函数来获取数据做对应的处理
                // 标签增加获取到数据后,后立即删除此标签即可
                document.head.removeChild(tag);
            }
            // 创建支持jsonp的接口返回的函数
            function list(arg) {
                console.log(arg)
            }
    
        </script>
    </html>

    点击按钮发请求,查看获取到的数据

     

     ajax 发起跨域请求

    参数说明:

    dataType: 'jsonp',  //数据类型
    jsonp:'callback', // 表示发送请求的时候传给后端url中的查询参数名
    jsonpCallback: 'list' // 表示发送请求的时候传给后端url中的查询参数名对应的值
    // jsonp 和jsonpCallback 的值组合在url中 相当于在url中加了?callback=list
    最后发请求的实际url地址类似:http://www.jxntv.cn/data/jmd-jxtv2.html?callback=list&_=1596885252309
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <script src="/static/jquery-2.2.3.min.js"></script>
    </head>
    <body>
        <h1>从后台获取结果</h1>
        {{ result }}
        <h1>前端js直接向其他域名发起get请求</h1>
        <input type="button" value="点击发起js请求" onclick="getContent();"/>
        <div id="container"></div>
    </body>
        <script>
            function getContent(){
    
                $.ajax({
                    url: 'http://www.jxntv.cn/data/jmd-jxtv2.html',
                    type:'POST',
                    dataType: 'jsonp',
                    jsonp:'callback',   // 表示发送请求的时候传给后端url中的查询参数名
                    jsonpCallback: 'list' // 表示发送请求的时候传给后端url中的查询参数名对应的值
                    // jsonp 和jsonpCallback 的值组合在url中 相当于在url中加了?callback=list
                })
            }
            // 创建支持jsonp的接口返回的函数
            function list(arg) {
                console.log(arg)
            }
    
        </script>
    </html>

  • 相关阅读:
    BurpSuite—-Spider模块(蜘蛛爬行)
    BurpSuite系列(一)----Proxy模块(代理模块)
    hadoop HA集群搭建步骤
    HBase详解
    MapReduce两种执行环境介绍:本地测试环境,服务器环境
    HBase性能优化方法总结
    HDFS原理解析
    ZooKeeper 典型应用场景
    Redis总结
    基于Apache Curator框架的ZooKeeper使用详解
  • 原文地址:https://www.cnblogs.com/zhangmingda/p/13459766.html
Copyright © 2011-2022 走看看