zoukankan      html  css  js  c++  java
  • JSONP的原理

     As we know,浏览器的同源策略,不允许访问非同源页面。ajax中,不允许请求非同源的URL,JSONP就是来解决跨域请求问题的,实现方法:

    script标签src属性中的链接可以访问跨域的js脚本,利用这个特性,服务端不再返回JSON格式数据,而是返回一段调用某个函数的js代码,在src中进行调用,这样实现跨域调用。

    可以动态的给页面添加一个script标签,src指向服务器(php)脚本执行返回的js代码,所以JSONP将访问跨域请求变成了执行远程的js代码,服务端不再返回JSON格式的数据,而是返回一段将JSON数据作为传入参数的函数执行代码
    所以JSONP只能解决GET请求的跨域请求。

    举个栗子:

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title></title>
        <script type="text/javascript">
        var localHandler = function(data){
            alert('我是本地函数,可以被跨域的remote.js文件调用,远程js带来的数据是:' + data.result);
        };
        </script>
        <script type="text/javascript" src="http://remoteserver.com/remote.js"></script>
    </head>
    <body>
     
    </body>
    </html>

    而服务器的remote.js文件内容是:

    localHandler({"result":"我是远程js带来的数据"});

    将response写在callback函数的参数里面,页面动态执行js文件时候直接就执行了这句代码。

    其实原理就是:动态生成js脚本是服务端返回的,服务端给返回的js脚本里面的callback函数传参,一般就是开发者自己在GET请求服务器代码时候加个callback参数告诉服务器我需要执行哪个函数,服务器就返回哪个函数的传参调用。

    那么,ajax也是请求一个url,然后响应服务器的response然后执行callback函数,跟JSONP有什么不同过呢?

    首先,本质上面的不同,Ajax的核心是通过XHR对象获取响应,而jsonp是通过动态添加一段js的返回函数自执行。

    【完】

    三乘五性皆醒悟,方知自有珍珠库。

  • 相关阅读:
    无锁队列的实现
    C/C++语言中闭包的探究及比较
    Linus:利用二级指针删除单向链表
    Unix考古记:一个“遗失”的shell
    “C++的数组不支持多态”?
    Alan Cox:单向链表中prev指针的妙用
    二叉树迭代器算法
    C语言全局变量那些事儿
    数据即代码:元驱动编程
    C++模板”>>”编译问题与词法消歧设计
  • 原文地址:https://www.cnblogs.com/tangjiao/p/9001463.html
Copyright © 2011-2022 走看看