关于javascript:JSONP的实现

1. 是什么

JSONP全称(Json with Padding);由Bob Ippolito于2005年提出。JSONP反对绕过同源策略共享数据。
因为同源策略,浏览器在发送Ajax申请时,只接管同域服务器响应的数据资源;JSONP是利用了 script 标签的 src 属性来实现跨域数据交互的,因为浏览器解析HTML代码时,原生具备src属性的标签,浏览器都赋予其HTTP申请的能力,而且不受跨域限度,应用src发送HTTP申请,服务器间接返回一段JS代码的函数调用,将服务器数据放在函数实参中,前端提前写好响应的函数筹备回调,接收数据,实现跨域数据交互;

二、实现

const jsonp = ({ url, params, callbackName }) => {
    const generateUrl = () => {
        let dataSrc = ''
        for (let key in params) {
            if (params.hasOwnProperty(key)) {
                dataSrc += `${key}=${params[key]}&`
            }
        }
        dataSrc += `callback=${callbackName}`
        return `${url}?${dataSrc}`
    }
    return new Promise((resolve, reject) => {
        const scriptEle = document.createElement('script')
        scriptEle.src = generateUrl()
        document.body.appendChild(scriptEle)
        window[callbackName] = data => {
            resolve(data)
            document.removeChild(scriptEle)
        }
    })
}

三、安全性问题

跨站申请伪造
简略的 JSONP 部署容易受到跨站点申请伪造(CSRF 或 XSRF)攻打。因为 HTML<script>元素不恪守Web浏览器实现中的同源策略,因而歹意页面能够申请并获取属于另一个站点的 JSON 数据。这将容许在歹意页面的上下文中评估 JSON 编码的数据,如果用户以后登录到其余站点,可能会泄露明码或其余敏感数据。

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理