跨域(三)——JSONP

摘要:
利用元素的这个开放策略,网页可以得到从其他来源动态产生的JSON资料,而这种使用模式就是所谓的JSONP。用JSONP抓到的资料并不是JSON,而是任意的JavaScript,用JavaScript直译器执行而不是用JSON解析器解析。2,后台返回一个js变量jsonp,这个jsonp就是请求后的JSON数据。但是在受信任的双方传递数据,JSONP是非常合适的选择。

一、什么是JSONP?

百度百科:JSONP(JSON with Padding)是JSON的 一种“使用模式”,可用于解决主流浏览器的跨域数据访问的问题。由于同源策略,一般来说位于 server1.example.com 的网页无法与不是 server1.example.com的服务器沟通,而 HTML 的<script> 元素是一个例外。利用 <script> 元素的这个开放策略,网页可以得到从其他来源动态产生的 JSON 资料,而这种使用模式就是所谓的 JSONP。用 JSONP 抓到的资料并不是 JSON,而是任意的JavaScript,用 JavaScript 直译器执行而不是用 JSON 解析器解析。

二、JSONP的实现思路很简单

1、前端创建script标记,设置src,添加到head中(当然也可以往body中添加)。

2, 后台返回一个js变量jsonp,这个jsonp就是请求后的JSON数据。

3, 回调完成后删除script标记(还有一些清理工作如避免部分浏览器内存泄露等)。

三、简单代码例子

服务器端:

<?php
$obj=array('chicken'=>2,'duck'=>3);//$ob是待传递对象
$callback=$_GET['callback'];//获取传入的函数名
if(!$callback){
    $callback='jsoncallback';//如果没传入就使用的默认函数名
}
//输出一段JS格式的代码,调用用传入的函数名,参数为需要传递的$obj对象
echo "alert('我是小偷,哈哈');".$callback.'('.json_encode($obj).');';
?>

客户端:

<div><span id="chicken"></span><br/><span id="duck"></span></div>
<script type="text/javascript">
//回调函数定义
functionmycallback(obj){
  //输出传递过来的对象
document.getElementById('chicken').innerHTML=obj.chicken;
  document.getElementById('duck').innerHTML=obj.duck;
};

window.onload=function(){
  //创建SCRIPT标签
  varscript=document.createElement("script");
  //设置URL
script.src="http://127.0.0.1:8081//langtao/steal.php?callback=alert('我是强盗');mycallback";
  //把标签放入文档中以便生效
document.body.appendChild(script);
  document.body.removeChild(script);
};
</script>

<!--<script>
$.ajax({
dataType:'jsonp',
data:'id=1',
jsonp:'callback',
url:'http://127.0.0.1:8081//langtao/steal.php',
success:function(obj){
    document.getElementById('chicken').innerHTML=obj.chicken;
    document.getElementById('duck').innerHTML=obj.duck;
},
});
</script>-->

<!--<script>
$.getJSON(
  "http://127.0.0.1:8081//langtao/steal.php?callback=?",
  function(obj){
    document.getElementById('chicken').innerHTML=obj.chicken;
    document.getElementById('duck').innerHTML=obj.duck;
  }
);
</script>-->

四、安全问题

JSONP虽然易于实现,但是也会存在一些安全隐患,如果第三方的脚本随意地执行,那么它就可以篡改页面内容,截获敏感数据。但是在受信任的双方传递数据,JSONP是非常合适的选择。

免责声明:文章转载自《跨域(三)——JSONP》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇【转】二维码生成原理async与await总结下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

bat批处理常用脚本

windows下有很多场景需要编写批处理来解决问题,跟定时任务相结合使用更佳。 1.创建文件,md,mkdir都可以进行文件创建 set AwrPath=D:OracleTabChk if not exist %AwrPath% (md %AwrPath%) 2.创建一个txt,因为批处理没有直接命令创建文件文件的命令,所以可以直接出书一个txt set...

LoadRunner简介

  LoadRunner是什么 LoadRunner是一个性能测试工具,它最初是Mercury公司的产品,后背HP收购。 LoadRunner常用来做什么 l 验证某系统在某环境下是否满足性能需求。 l 通过测试,规划如何达到要求的性能指标。 l 调整系统环境,进行性能测试,最终使性能达到最优。 为什么要使用LoadRunner进行性能测试 考虑这样一种情...

使用shell脚本实现用ping检查刀片服务器与主服务器之间的网络连通

为了检查daq01与刀片服务器之间的网络连接状态, 1. 使用ping命令的输出规律,如果可以ping通,会输出0% packet loss值; 如果不能ping通,则不会输出0% packet loss 2. 若ping命令输出0% packet loss执行成功,则表示网络连接正常,否则网络连接不上 3. shell脚本里的&&与 ||...

从V8引擎编程理解javascript执行环境

一、V8简介 google code上对它的解释如下: V8 is Google's open source JavaScript engine. V8 is written in C++ and is used in Google Chrome, the open source browser from Google. V8 implements...

Chart.js实现饼图

页面: 引入静态脚本: <script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>   <script src="https://code.highcharts.com/highcharts.js"></script&g...

android DHCP流程【转】

本文转载自:http://blog.csdn.net/myvest/article/details/51483647 版权声明:本文为博主原创文章,未经博主允许不得转载。   目录(?)[+]   1、问题背景 最近遇到一个问题,在一个项目中,无论静态或是DHCP,都无法成功修改DNS。 最后发现,是因为/etc/dhcpcd/dhcpcd-hooks...