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单点登陆。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

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