JSONP,全名是JSON with Padding,是一种通过<script>
标签来获取跨域数据的策略。它本质上不是一个新的技术,只是JavaScript的普通函数调用的一种形式,即利用了网页脚本的同源策略。
优点:
- 实现简单:JSONP的实现相对简单,只需要将返回的数据包裹在一个函数调用中,然后通过动态创建
<script>
标签来获取数据。 - 跨域支持:由于它利用了
<script>
标签的同源策略,所以可以突破浏览器的同源策略限制,实现跨域数据请求。
缺点:
- 只支持GET请求:JSONP只支持GET请求,不能使用POST、PUT、DELETE等其他HTTP方法。
- 安全性问题:JSONP的安全性相对较低,因为它返回的数据是明文的,没有经过任何的加密或编码,容易被恶意攻击者获取并利用。
- 兼容性问题:虽然大部分现代浏览器都支持JSONP,但一些较老的浏览器可能不支持。
代码示例:
假设我们有以下的JSONP请求:
<script> function handleData(data) { console.log(data); } var script = document.createElement('script'); script.src = 'http://example.com/data?callback=handleData'; document.body.appendChild(script); </script>
这个例子中,我们创建了一个名为handleData
的函数,用于处理从服务器获取的数据。然后我们创建了一个<script>
标签,将其src
属性设置为服务器的URL,同时将回调函数名作为参数传递给URL。最后我们将<script>
标签添加到文档的body
中,这样就可以触发与服务器的跨域请求。
在服务器端,它需要返回类似下面的JSON数据:
handleData({"name": "John", "age": 30});
这样,当浏览器获取到这个数据后,会调用handleData
函数,将数据作为参数传入。