热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

跨域要领总结(一),JSONP

媒介博主博客:Stillwater的博客知乎专栏:前端汪汪本文为作者原创转载请说明出处:http:hiztx.top20170115j…  本文引见了什么是跨域,为何要跨域,以及跨
媒介

博主博客:Stillwater的博客
知乎专栏:前端汪汪
本文为作者原创转载请说明出处:http://hiztx.top/2017/01/15/j…

  本文引见了什么是跨域,为何要跨域,以及跨域的一种经常运用要领JSONP的道理。

一、什么是跨域?为何要跨域?

什么是跨域?

  既然是跨域,那末肯定是从一个域到另一个域。那末起首要晓得满足什么前提才是同一个域。假如两个页面具有雷同的协定,端口和域名,那末这两个页面就属于同一个源(origin),Javascript许可这类同源页面的数据互相通讯。比方你要接见百度首页。

https://www.baidu.com
https是协定
https协定的默许端口为443(不显现)
www.baidu.com为域名

注:平常端口默许为不显现,然则你能够尝试输入以下网址,发明无法接见。因为80端口默许为http协定端口。

https://www.baidu.com:80

  如今晓得了什么是同一个域,那末就能够诠释什么是跨域。只需协定、域名、端口有任何一个差别,都被看成是差别的域,之间的要求就是跨域操纵。

为何要跨域?

  置信很多人都听过,同源战略。出于平安斟酌,浏览器对Javascript的很多功用举行了限定,个中一条就是,差别域之间不予许举行数据通讯。虽然补全了平安漏洞,然则这个限定给前端开辟带来了很多不方便。比方:

zhidao.baidu.com
wenku.baidu.com

  百度晓得和百度文库人人都不生疏,都是百度开辟的web效劳。虽然这两个都是李彦宏的,然则如今通知他,因为你这两个域名的三级域名不一样,不许可互相数据通讯。你说不可就不可?因而就有像李彦宏如许的大牛搞出一些黑科技特地用来跨域通讯。JSONP就是个中之一。

注:
1.com为顶级域名,baidu为二级域名,zhidao/wenku为三级域名
2.跨域并不是浏览器限定了提议跨站要求,而是跨站要求能够一般提议,但返回效果被浏览器阻拦了。

二、什么是JSONP?

望文生义:

JSOnP= JSON + P

  JSONP(JSON with Padding),JSON是一种轻量级的数据交换花样。而Padding在这里能够翻译为添补。那末JSONP的意义就是,添补的JSON。是数据花样JSON的一种运用形式,能够让网页从别的网域要数据。

三、JSONP道理

JSONP的中心道理就是,HTML的script标签能够加载并实行其他域JS文件。

  这里辨别两个观点,当我们用浏览器翻开百度晓得首页的时刻,是向百度晓得效劳器发送了一个Https要求,获取到百度晓得首页的index.html。假如在这个index.html内里用XMLHttpRequest对象向百度文库效劳器发送Https要求,那末就属于跨域,是不许可的。然则假如在百度晓得首页的index.html中到场一个script标签,其src属性指向百度文库中的一个.json文件,是许可的。
  为了明白这类形式的道理,先想像有一个回传JSON文件的URL,而Javascript 顺序能够用XMLHttpRequest跟这个URL要数据。假定我们的URL是 http://server2.example.com/Re… 。假定小明的UserId 是1823,且当浏览器经由过程URL传小明的UserId,也就是抓取 http://server2.example.com/Re… 。获得:

{"Name": "小明",
"Id": 1823,
"Rank": 7
}

  这个JSON数据多是根据传过去URL的查询参数动态发生的。这个时刻,把 script元素的src属性设成一个回传JSON的URL是能够想像的,这也代表从HTML页面经由过程script元素抓取JSON是能够的。但是,一份JSON文件并不是一个Javascript顺序。为了让浏览器能够在 script元素运转,从src里URL回传的必需是可运转的Javascript。在JSONP的运用形式里,该URL回传的是由函数挪用包起来的动态天生JSON,这就是JSONP的“添补(padding)”或是“前辍(prefix)”的由来。

  效劳器会在传给浏览器前将JSON数据添补到回调函数(parseResponse)中。浏览器获得的回应已不是纯真的数据叙说而是一个剧本。在本例中,浏览器获得的是:

{
parseResponse(
{
"Name": "小明",
"Id": 1823,
"Rank": 7
})
}

  也就是说,平常情况下浏览器向效劳器发送要求获得的都是数据(文本,XML,JSON),然则当采纳JSONP手艺时刻,浏览器向跨域效劳器发送要求,获得的是回调函数包住的JSON。此处JSON作为参数传入回调函数,然后再返回给浏览器。

再举个例子:

浏览器端:




效劳器端:

$jsOndata= '{
"name": "Stillwater",
"age": 12
}';
echo $_GET['callback'].'('.$jsondata.')';
?>

效劳器返回浏览器:

jsonpcallback(
{
"name": "Stillwater",
"age": 12
}
)

  在这个例子中,浏览器向效劳器发出跨域要求 http://localhost:8080/test.ph… 。要求一个json数据, {“name”: “Stillwater”,”age”: 12} 。而且通知了效劳器回调函数的名字。效劳器接收到要求后,就将json数据作为参数添补到回调函数中,返回给浏览器。终究返回一个添补了json数据的回调函数。

四、总结
  1. 起首在客户端注册一个callback,然后把callback的名字传给效劳器。

  2. 效劳器先天生json数据。然后以Javascript语法的体式格局,天生一个function ,function名字就是通报上来的参数callback。 末了将json数据直接以入参的体式格局,安排到function中,如许就天生了一段 js 语法的文档,返回给客户端。

  3. 客户端浏览器,剖析script标签,并实行返回的Javascript 文档,此时数据作为参数,传入到了客户端预先定义好的callback 函数里。(动态实行回调函数)

参考链接:

https://zh.wikipedia.org/wiki…
http://www.cnblogs.com/zichi/…
http://tech.jandou.com/cross-…
https://segmentfault.com/a/11…
http://wearejq.github.io/2015…


推荐阅读
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • WebSocket与Socket.io的理解
    WebSocketprotocol是HTML5一种新的协议。它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送 ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 本文介绍了通过ABAP开发往外网发邮件的需求,并提供了配置和代码整理的资料。其中包括了配置SAP邮件服务器的步骤和ABAP写发送邮件代码的过程。通过RZ10配置参数和icm/server_port_1的设定,可以实现向Sap User和外部邮件发送邮件的功能。希望对需要的开发人员有帮助。摘要长度:184字。 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
author-avatar
itbases
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有