jsonp系列(二)jsonp的原理与实现方式

在介绍jsonp之前,先来聊一聊浏览器的同源策略。

关于同源策略的由来

1995年,同源策略被引入到浏览器中,其目的是为了保护用户的数据安全。

同源策略主要做了以下几点的限制:

(1) 非同源站点上的Cookie、LocalStorage 和 IndexDB 无法读取。

(2) 非同源站点上面的DOM节点 无法获得。

(3) AJAX 请求不能发送给非同源站点。

试想一下,如果没有这些限制,你在浏览网站的时候,你的cookie可以被别人随意读取,别人可以直接用你的身份去登陆网站,肆意的发挥;你页面的dom结构还可以被别人控制,肆意修改,就问你一句:怕不怕?

反正

我怕!

但是,任何事情都有两面性,浏览器禁止页面脚本跨域请求提高了安全性的同时,也带来一些不方便。

很多时候我们确实需要跨站去请求一些资源,那浏览器同源策略的限制是不是有限苛刻了?

其实细心的小伙伴们已经发现,浏览器在为我们关闭一扇门的同时,给我们打开了一扇窗,带有src属性的img标签,你随便在src里面写上任意一个网站的图片地址,就可以获取这个图片的数据,说明它是不受同源策略限制的。script标签也是一样,又比如link标签,我们的css可以引入外部站点的css文件,获取对方站点的css文件数据。

接下来,我们要介绍的jsonp就是利用script标签的src不受跨越限制特性来实现的。

jsonp的实现原理

写js的时候,我们会在script标签里面引入我们需要的js文件,有自己网站上的,也有别的网站上的,不管哪个网站上的js文件,只要引入了,都可以去运行,丝毫不受同源策略的影响。

利用这个特性,我们就开始写我们的代码了:

先从一段简单的代码开始:

(1)在http://a.com下新建http://a.com/test.html文件,代码如下:



(2)在b.com下面新建文件http://b.com/test.js文件,代码如下:


(3)访问http://a.com/index.html文件,页面上会弹出“111”

此时此刻,我们的这个小例子就已经实现了跨域访问数据了,这是很多人会想,http://b.com/test.php下面的数据我如何拿到呢?光弹出有什么用?我需要操作这个返回结果呀?

别急,我们继续往下看:

(1)现在我们修改http://b.com/test.js文件,代码如下:


(2)修改http://a.com/test.html文件,代码如下:


(3)访问http://a.com/test.html,输出如下:



看,现在http://b.com/test.js里面的数据我们拿到了,跨域操作就是这么简单,3步就完成了。

不过善于思考的朋友又会问,你这样复制的方式,属于全局变量的操作方式,这种方式不好。

#新手朋友们可能不知道为啥全局变量不好,这里稍稍解释下,例如你引入了a.js文件,a.js文件里面写了var a='面面包';又引入了b.js文件,但是b.js文件里面写了var a='屎';然后当你运行alert(a)的时候居然弹出了“屎”,你点了一份面包,别人送你一坨屎,你觉得这样好吗?所以说全局变量是个很讨厌的东西。

那么,不用赋值的方式,我们如何把数据获取到呢?

(1)现在我们修改http://b.com/test.js文件,代码如下:


(2)修改http://a.com/test.html文件,代码如下:


(3)访问http://a.com/test.html,输出如下:


现在不用担心全局污染了,我们通过函数调用的方式获取到了我们想要的数据。

不过又有朋友要问了,你这样页面一访问就加载数据,如果我希望手动触发事件之后才去获取数据呢?

好,咱继续往下看:

(1)现在我们修改http://b.com/test.js文件,代码如下:


(2)修改http://a.com/test.html文件,代码如下:


(3)访问http://a.com/test.html,点击一下按钮”点击“,效果如下:


通过动态生成script标签的方式,我们实现了手动获取数据的方式。

以上就是今天要介绍的jsonp的原理和实现方式,接下来,我会介绍jquery下jsonp的写法以及通过jsonp跨域实现sso单点登陆。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,723评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,080评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,604评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,440评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,431评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,499评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,893评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,541评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,751评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,547评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,619评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,320评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,890评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,896评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,137评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,796评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,335评论 2 342

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,579评论 18 139
  • AJAX 原生js操作ajax 1.创建XMLHttpRequest对象 var xhr = new XMLHtt...
    碧玉含香阅读 3,168评论 0 7
  • 1.什么是同源策略 1.要了解同源策略,我们必须先知道源即orgin 以百度页面为例,谷歌浏览器打开控制台:输入l...
    GarenWang阅读 1,437评论 2 8
  • 跨域以及跨域的几种方式 讲解跨域之前我们先来看看什么是同源策略 什么是同源策略 通常来说,浏览器出于安全方面的考虑...
    尾巴尾巴尾巴阅读 1,592评论 0 1
  • 每年都说自己又18岁了 今年必须要好好正视一下自己22周岁啦 大学毕业是个大姑娘了 新一岁的小目标 尽快经济独立 ...
    粒粒_阅读 132评论 0 0