JSONP的介绍
JSONP:利用在页面中创立 <script>
节点的办法向不同域提交HTTP申请的办法。
JSONP跨域的基本原理:因为script
标签不受浏览器同源策略的影响,容许跨域援用资源。因而,通过动态创建 script 标签,而后利用 src
属性进行跨域。
JSONP的长处:不受同源策略的限度;兼容性好,在老的浏览器中能够运行;申请结束后能够通过调用 callback 的形式回传后果。
JSONP的毛病:只反对 GET
这种HTTP申请;jsonp在调用失败的时候不会返回各种HTTP状态码;安全性:callback传入的参数是在后端进行了一次拼接,这即代表存在注入的可能,如果后端设计不当,是有可能呈现平安危险的。
JSONP的封装
// jsonp的封装function jsonp(params) { // 创立script标签并退出到head中 var callbackName = params.jsonp; var head = document.getElementsByTagName('head')[0]; // 设置传递给后盾的回调参数名 params.data['callback'] = callbackName; var data = formatParams(params.data); var script = document.createElement('script'); // 发送申请 script.src = params.url + '?' + data; // 创立jsonp回调函数 window[callbackName] = function (res) { head.removeChild(script); clearTimeout(script.timer); window[callbackName] = null; params.success && params.success(res); }; head.appendChild(script); // 为了得悉此次申请是否胜利,设置超时解决 if (params.time) { script.timer = setTimeout(function () { window[callbackName] = null; head.removeChild(script); params.error && params.error({ message: '超时' }); }, 500); }}// 格式化参数function formatParams(data) { var arr = []; for (var name in data) { arr.push(encodeURIComponent(name) + '=' + encodeURIComponent(data[name])); }; // 增加一个随机数,避免缓存 arr.push('v=' + random()); return arr.join('&');} // 获取随机数function random() { return Math.floor(Math.random() * 10000 + 500);}
JSONP的调用
jsonp({ url: url, jsonp: 'jsonpCallback', data: dataParams, success: function (res) { params.success && params.success(); }, error: function (error) {}})
参考文章:
- 面试经典之Jsonp跨域原理
- jsonp 跨域原理剖析