跨域之JSONP

180 阅读2分钟

关于JSONP的介绍网上搜索一大堆,其实原理很简单,写本文其实很大原因是对自己前端学习做一个记录,同时也方便他人学习,废话不多说,下面进入正文。

JSONP正文

跨域是什么:一句话概括就是:访问不同源的资源,浏览器因为同源策略限制,无法访问不同源的资源,所谓同源就是协议,端口,域名完全相同才是同源

非同源图片的访问

由于同源策略限制,我们无法请求不同源的数据,但是我们发现图片的src属性可以访问不同源的资源,见下图http://localhost:3000/public/build/aaa.html访问一张网络上的图片资源。

非同源script标签的访问

其实不仅图片的src可以访问不同源的数据,script标签src也可以加载不同源的数据。
下图中http://localhost:3000/public/build/aaa.html访问http://localhost:8089/static/jsonp.js资源。

下面打印出来的数据,就是上图中<script src='http://localhost:8089/static/jsonp.js'></script>执行的结果。

服务器端实现 (需要了解服务器端实现看这里,不想了解的跳过。服务器端代码贴出来)

<script src='http://localhost:8089/static/jsonp.js'></script>
相当于
<script> console.log('朴宰范,中国新说唱2020') </script>

动手实现JSONP

  • 客户端代码

  • 服务器端代码

  • 浏览器展示结果

  • 客户端代码15-21行代码实际上是在dom内添加了<script src = 'http://localhost:8089/static/jsonp.js?callback=getData'></script> 去请求服务器资源,服务器解析请求的url中callback的值getData,然后执行getData(),并传入需要返回给客户端的数据'朴宰范,中国新说唱2020' ,这一波操作就相当于在dom中 <script>getData('朴宰范,中国新说唱2020')</script>

  • 然后客户端的24-27行getData就会被执行,拿到'朴宰范,中国新说唱2020'并把数据放入p标签内展示。

JSONP 引申出来的两个问题

1,JSONP请求服务器端发生错误怎么办,前端如何处理这个错误。

** script标签遇到错误会触发error事件,所以我们可以这样写,见下图。 **

2,JSONP动态生成script标签,需要不需要处理这个script标签,如何处理。

** 监控script标签加载状态,当加载完成或者加载失败移除script标签,同时移除标签上的监听事件以及挂载在window上的回调函数,防止内存泄露。 **

774