5、这样,解决方案就呼之欲出了,web服务端通过与调用脚本一模一样的方式,来调用跨域服务器上动态生成的js格式文件,显而易见,服务器之所以要动态生成JSON文件,目的就在于把客户端需要的数据装进去。

6、客户端在对JSON文件调用成功之后,也就获得了自己所需的数据,剩下的就是按照自己需求进行处理和展现了,这种获取远程数据的方式看起来很像ajax,但其实并不一样。

7、为了便于客户端使用数据,逐渐形成了一种非正式传输协议,简称JSONP。该协议的一个要点就是允许用户传递一个callback参数给服务端,然后服务端返回数据时会将这个callback参数作为函数名包裹在JSON数据,这样客户端就可以随意定制自己的函数来自动处理返回数据了。

二、JSONP的客户端实现


1、远程调用其它服务器上的js文件(跨域成功)


<!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" src="http://remoteserver.com/remote.js"></script></head><body></body></html>

2、远程调用js

现在我们在jsonp.html页面定义一个函数,然后在远程remote.js中传入数据进行调用。


<!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带来的数据"});

运行之后查看结果,页面成功弹出提示窗口,显示本地函数被跨域的远程js调用成功,并且还接收到了远程js带来的数据。

很欣喜,跨域远程获取数据的目的基本实现了,但是又一个问题出现了,我怎么让远程js知道它应该调用的本地函数叫什么名字呢?毕竟是jsonp的服务者都要面对很多服务对象,而这些服务对象各自的本地函数都不相同。

3、动态生成js脚本

聪明的开发者很容易想到,只要服务端提供的js脚本是动态生成的就行了呗,这样调用者就可以传一个参数过去告诉服务端,“我想要一段调用xxx函数的js代码,请你返回给我”,于是服务器就可以按照客户端的需求来生成js脚本并响应了。

看jsonp.html页面的代码:


<!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 flightHandler = function(data){alert('你查询的航班结果是:票价 ' + data.price + ' 元,' + '余票 ' + data.tickets + ' 张。');};// 提供jsonp服务的url地址(不管是什么类型的地址,最终生成的返回值都是一段javascript代码)var url = "http://flightQuery.com/jsonp/flightResult.aspx?code=CA1998&callback=flightHandler";// 创建script标签,设置其属性var script = document.createElement('script');script.setAttribute('src', url);// 把script标签加入head,此时调用开始document.getElementsByTagName('head')[0].appendChild(script); </script></head><body></body></html>

这次的代码变化比较大,不再直接把远程js文件写死,而是编码实现动态查询,而这也正是jsonp客户端实现的核心部分,本例中的重点也就在于如何完成jsonp调用的全过程。

我们看到调用的url中传递了一个code参数,告诉服务器我要查的是CA1998次航班的信息,而callback参数则告诉服务器,我的本地回调函数叫做flightHandler,所以请把查询结果传入这个函数中进行调用。

OK,服务器很聪明,这个叫做flightResult.aspx的页面生成了一段这样的代码提供给jsonp.html

(服务端的实现这里就不演示了,与你选用的语言无关,说到底就是拼接字符串):


flightHandler({"code": "CA1998","price": 1780,"tickets": 5});

4、封装代码

到这里为止的话,相信你已经能够理解jsonp的客户端实现原理了吧?剩下的就是如何把代码封装一下,以便于与用户界面交互,从而实现多次和重复调用。

jQuery如何实现jsonp调用?


<!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>Untitled Page</title># Spring全套教学资料**Spring是Java程序员的《葵花宝典》,其中提供的各种大招,能简化我们的开发,大大提升开发效率!目前99%的公司使用了Spring,大家可以去各大招聘网站看一下,Spring算是必备技能,所以一定要掌握。****[CodeChina开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频】](https://codechina.csdn.net/m0_60958482/java-p7)****目录:**![](https://img-blog.csdnimg.cn/img_convert/93bac8bd0b4d91c7e171bdb57ba0258e.png)![](https://img-blog.csdnimg.cn/img_convert/cfb9a2dfd763ebdb944782c1e6cff471.png)**部分内容:**![](https://img-blog.csdnimg.cn/img_convert/e38488e69d6b833b0075ceea0d47f398.png)![](https://img-blog.csdnimg.cn/img_convert/f0e8f64d27939beeba970066007817b5.png)# Spring源码*   第一部分 Spring 概述
*   第二部分 核心思想
*   第三部分 手写实现 IoC 和 AOP(自定义Spring框架)
*   第四部分 Spring IOC 高级应用基础特性高级特性
*   第五部分 Spring IOC源码深度剖析设计优雅设计模式注意:原则、方法和技巧
*   第六部分 Spring AOP 应用声明事务控制
*   第七部分 Spring AOP源码深度剖析必要的笔记、必要的图、通俗易懂的语言化解知识难点![](https://img-blog.csdnimg.cn/img_convert/f2657c16c4fa6a41b1ca5a6dde7edced.png)![](https://img-blog.csdnimg.cn/img_convert/68a7e593782c3c05d84d318e10f44c39.png)# 脚手框架:SpringBoot技术> 它的目标是简化Spring应用和服务的创建、开发与部署,简化了配置文件,使用嵌入式web服务器,含有诸多开箱即用的微服务功能,可以和spring cloud联合部署。
>
> Spring Boot的核心思想是约定大于配置,应用只需要很少的配置即可,简化了应用开发模式。*   SpringBoot入门
*   配置文件
*   日志
*   Web开发
*   Docker
*   SpringBoot与数据访问
*   启动配置原理
*   自定义starter![](https://img-blog.csdnimg.cn/img_convert/0f21fe89662766127ab0d53852e44c16.png)![](https://img-blog.csdnimg.cn/img_convert/450bc9acfa2709f65e8b1bdab10fa6a0.png)# 微服务架构:Spring Cloud Alibaba> 同 Spring Cloud 一样,Spring Cloud Alibaba 也是一套微服务解决方案,包含开发分布式应用微服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。*   微服务架构介绍
*   Spring Cloud Alibaba介绍
*   微服务环境搭建
*   服务治理
*   服务容错
*   服务网关
*   链路追踪
*   ZipKin集成及数据持久化
*   消息驱动
*   短信服务
*   Nacos Confifig—服务配置
*   Seata—分布式事务
*   Dubbo—rpc通信![](https://img-blog.csdnimg.cn/img_convert/0462d0145314139a4d16517aacc10552.png)![](https://img-blog.csdnimg.cn/img_convert/0d3eed462286a9a528bb7755363b03a5.png)# Spring MVC**目录:**![](https://img-blog.csdnimg.cn/img_convert/8aa8efef8a9d7669bf439a41864140c4.png)![](https://img-blog.csdnimg.cn/img_convert/429068be9259d4f69aa3867694a2d6bb.png)![](https://img-blog.csdnimg.cn/img_convert/29fef5bb2e6f2deb2bc57fd1d79df02b.png)**部分内容:**![](https://img-blog.csdnimg.cn/img_convert/c0534a001500f7e02db13103f69fe93d.png)![](https://img-blog.csdnimg.cn/img_convert/50d51a0519c41aef9586366e5f0b24b4.png)1j6gP-1630469651966)][外链图片转存中...(img-OHpZS9QL-1630469651966)]# Spring MVC**目录:**[外链图片转存中...(img-btdO1RVq-1630469651967)][外链图片转存中...(img-Z5MiSFag-1630469651967)][外链图片转存中...(img-GXOWW0on-1630469651968)]**部分内容:**[外链图片转存中...(img-xt3DLlsT-1630469651969)][外链图片转存中...(img-FAN9uv2z-1630469651969)]

jsonp原理详解——终于搞清楚jsonp是啥了,rabbitmq原理总结相关推荐

  1. ThreadLocal原理详解--终于弄明白了ThreadLocal

    ThreadLocal原理详解 在我看到ThreadLocal这个关键字的时候我是懵逼的,我觉得我需要弄明白,于是,我就利用搜索引擎疯狂查找,试图找到相关的解答,但是结果不尽人意. 首先说一下我的理解 ...

  2. Android高工:okhttp原理详解,搞懂了直接去虐面试官

    当连接池中有连接时:清理任务由cleanup()方法完成,首先执行清理,并返回下次需要清理的间隔时间,调用调用wait() 方法释放锁.等时间到了以后,再次进行清理,并返回下一次需要清理的时间间隔,再 ...

  3. nginx配置文件及工作原理详解

    nginx配置文件及工作原理详解 1 nginx配置文件的结构 2 nginx工作原理 1 nginx配置文件的结构 1)以下是nginx配置文件默认的主要内容: #user nobody; #配置用 ...

  4. LVS原理详解及部署之五:LVS+keepalived实现负载均衡高可用

    本文我们主要讲解的是LVS通过keepalived来实现负载均衡和高可用,而不是我们第三篇文章介绍的通过手动的方式来进行配置.通过脚本的方式来显示RS节点的健康检查和LVS的故障切换.此文会通过一个实 ...

  5. LVS原理详解及部署之四:keepalived介绍

    -------------------LVS专题------------------------ LVS原理详解及部署之一:ARP原理准备 LVS原理详解及部署之二:LVS原理详解(3种工作方式8种调 ...

  6. Android面试Hash原理详解二

    Hash系列目录 Android面试Hash原理详解一 Android面试Hash原理详解二 Android面试Hash常见算法 Android面试Hash算法案例 Android面试Hash原理详解 ...

  7. Diffusion Model原理详解及源码解析

    作者:秃头小苏@CSDN 编辑:3D视觉开发者社区 文章目录 Diffusion Model原理详解及源码解析 写在前面 Diffusion Model原理详解✨✨✨ 整体思路 实施细节 正向过程 逆 ...

  8. 文本分类算法TextCNN原理详解

    详情请看:膜拜大佬![原创]文本分类算法TextCNN原理详解(一) - ModifyBlog - 博客园 Textcnn 原理 与rnn lstm 的比较, Textcnn更快 textCNN的总结 ...

  9. 激活函数、Sigmoid激活函数、tanh激活函数、ReLU激活函数、Leaky ReLU激活函数、Parametric ReLU激活函数详细介绍及其原理详解

    相关文章 梯度下降算法.随机梯度下降算法.动量随机梯度下降算法.AdaGrad算法.RMSProp算法.Adam算法详细介绍及其原理详解 反向传播算法和计算图详细介绍及其原理详解 激活函数.Sigmo ...

最新文章

  1. linux 3.4内核初始化,S3C2440移植linux3.4.2内核之内核框架介绍及简单修改
  2. 设置释放COCOS2D-X 的启动流程
  3. 网络故障解决方案之非标准子网划分【网管员必懂】
  4. Qt入门之基础篇 ( 一 ) :Qt4及Qt5的下载与安装
  5. Java虚拟机——Java内存区域与内存溢出
  6. 【car】购买新能源电动汽车的几个注意事项
  7. android studio sugar,Android | Sugar 的介绍和简单使用
  8. param参数服务器
  9. for循环如果先--_97-for循环嵌套 输出反倒直角三角形
  10. Python游戏开发! Mac完美安装pygame
  11. 二级java考什么_​Java计算机二级考试考什么
  12. 【智能优化算法】基于基于遗传算法实现认知无线电优化求解附matlab代码
  13. python多条件筛选数据并计数_Numpy | 排序、条件筛选函数、统计函数
  14. 在 Intel NUC8i7HVK 上安装CentOS7
  15. 【智能家居】空调遥控器破解
  16. 汉王速录笔linux驱动下载,汉王速录笔v586s驱动
  17. 百度网盘新用户超级会员多少钱
  18. linux如何批量改名,Linux 批量改名之 rename 命令
  19. Python控制Excel表格的操作以及问题处理
  20. 百度竞价推广中的,28定律是什么?

热门文章

  1. python之json序列化与反序列化
  2. java对象Json序列化,修改Json序列化后字段名
  3. 关于Chrome 69 版本 一些改变以及设置
  4. go time Format 格式化时间的使用
  5. Linux虚拟内存和物理地址的理解【转】
  6. isnan函数matlab
  7. 区块链技术赋能音乐作品版权保护 法院采信存证证书作为有效权属证据
  8. 内网环境安装python所需的模块
  9. uniapp银联支付
  10. 概率质量函数(PMF)、概率密度函数(PDF)、累积分布函数(CDF)