为了账号安全,请及时绑定邮箱和手机立即绑定

JSONP原理与实现

  • JSON with Padding(Padding 指包裹在服务端响应内容中 JSON 外层的函数名称)

  • 它与 Ajax 无任何关系

  • jsonp

优点

  • 兼容性好,在支持创建 script 标签对的旧版本浏览器中依旧可以良好支持。

缺点

  • 仅支持GET方法

  • 动态创建脚本容易产生XSS攻击

原理

由于浏览器的同源策略限制,在目标域名、端口、协议不一致的情况下,将无法访问目标提供的资源。但是,HTML某些标签提供的src属性,不受该策略影响,因此可以通过该种方式获取目标资源。

  1. 前端动态生成 script 标签对,并设置目标 URL 为 src 属性值。其中,目标 URL 通常会包含客户端 callback 参数名。

  2. 服务端接收 callback 参数;服务端生成响应数据,并使用 callback 参数值包裹该响应内容(传递到客户端后作为函数的参数)。

  3. 客户端加载完成目标资源后,响应内容将在 script 中变为正常的函数调用。

实现

需要服务端配合

前端(原生JS)

<script type="text/javascript">
const customFn = function (data) {  
 // 在获取到目标资源后,将调用该函数   
 console.log(data)
 }
 // 目标API
 const targetURL = 'https://api.shaoyaoju.org/jsonp?callback=customFn';
 // 动态创建 script 标签,并设置 src 属性
 const script = document.createElement('script');
 script.setAttribute('src', targetURL);
 // 将 script 标签插入 body,开始调用目标资源
 document.getElementsByTagName('body')[0].appendChild(script);</script>

后端(Koa.js 实现)

const get = async ctx => {   
  // 获取 callback 参数
   const { callback } = ctx.query
   // 包裹数据
   const data = callback + `({"data": {"key": "value"}})`
   ctx.body = data
}
点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
Web前端工程师
手记
粉丝
870
获赞与收藏
3669

关注作者,订阅最新文章

阅读免费教程

  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消