JSONP原理与实现
JSON with Padding(Padding 指包裹在服务端响应内容中 JSON 外层的函数名称)
它与 Ajax 无任何关系
jsonp
优点
兼容性好,在支持创建 script 标签对的旧版本浏览器中依旧可以良好支持。
缺点
仅支持GET方法
动态创建脚本容易产生XSS攻击
原理
由于浏览器的同源策略限制,在目标域名、端口、协议不一致的情况下,将无法访问目标提供的资源。但是,HTML某些标签提供的src属性,不受该策略影响,因此可以通过该种方式获取目标资源。
前端动态生成 script 标签对,并设置目标 URL 为 src 属性值。其中,目标 URL 通常会包含客户端 callback 参数名。
服务端接收 callback 参数;服务端生成响应数据,并使用 callback 参数值包裹该响应内容(传递到客户端后作为函数的参数)。
客户端加载完成目标资源后,响应内容将在 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 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦