`

JSONP浅析(转)

 
阅读更多

觉得有用转的,源地址:

http://hi.baidu.com/l4yn3/item/0a2b8ed3734921362b35c7e0

 

 JSONP即JSON with padding,翻译成中文就是带填充的json,如果你告诉我你不知道什么是json,那建议你先去补习一下,很简单的东西。当然没关系jsonp不一定要用json数据格式的。

我们都知道ajax可以异步的处理数据给我们更好的用户体验,但是有一个问题:ajax只能获取同服务器上面的数据,也就是说它只能获得属于你自己的数据,别的服务器上的数据你是没有权利用它访问的。这就是所谓的同源策略,当初为了浏览器的安全定下的规则。可是如果我们需要用javascript访问非同源的数据怎么办,jsonp将是一个很好的选择。

话不多少,先贴实例代码,来源于网络。

 jsonp.html

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Demo</title>
<script type="text/javascript">
function say(words) {
alert(words);
}
</script>
</head>
<body>
<script type="text/javascript" src="jsonp.php?callback=say"></script>
</body>
</html>

jsonp的关键技术就是用script标签调用远程脚本文件,因为这种方式是不受同源策略限制的。<script type="text/javascript" src="jsonp.php?callback=say"></script>
将向src所指向的远程脚本发送请求,当远程脚本文件处理完请求,按照http协议,当然会给客户端以相应。

 jsonp.php代码如下:

<?php
$type = isset($_GET['type']) ? $_GET['type'] : '';
$callback = isset($_GET['callback']) ? $_GET['callback'] : '';
$json = '';

if ($type == 'json') {
$json = '{
"Image": {
"Width": 800,
"Height": 600,
"Title": "View from 15th Floor",
"Thumbnail": {
"Url": "http://www.example.com/image/481989943",
"Height": 125,
"Width": "100"
},
"IDs": [116, 943, 234, 38793]
}
}';
} else {
$json = '"Hello, everyone!"';
}

if (!empty($callback)) {
$json = $callback . '(' . $json . ')';
}

echo $json;

很简单是吧,我大概解释一下:我所请求的url是="jsonp.php?callback=say,没有发送json字符串,也就是说按照流程$json = '"Hello, everyone!"',然后由于$callback不为空,那么$json将被赋值为say("Hello everyone"),之后echo $json,就是echo say("Hello everyone")。 我们知道无论是ajax还是什么,任何的输出都将作为服务器端对客户端的相应,那这样say("Hello everyone")就将返回给请求它的<script type="text/javascript" src="jsonp.php?callback=say"></script>标签对,也就变成了<script type="text/javascript" src="jsonp.php?callback=say">say("Hello everyone")</script>,又因为我们在
jsonp.html定义了say(words)这个函数,所以他会被执行,将会alert出Hello everyone!如图:

   

现在我们完成了调用服务器端数据的功能了,这就是最基本的jsonp原理,当然他能做很多很强大的事情!很明显它是需要服务器端配合的,可是如果程序没有写好,也会让黑客用这种技术来获取数据的!

 你可以试着修改一下请求的url,看看都回返回什么结果,深入的理解一下这个东西。

 

分享到:
评论

相关推荐

    浅析json与jsonp区别及通过ajax获得json数据后格式的转换

    有关json与jsonp的区别(json才是目的,jsonp只是手段)介绍如下所示: 一言以蔽之,json返回的是一串数据;而jsonp返回的是脚本代码(包含一个函数调用); JSON其实就是JavaScript中的一个对象,跟var obj={}在质...

    浅析JSONP技术原理及实现

    JSONP(JSON with Padding)是一种老旧的跨域数据访问技术,允许网页从不同的源请求数据。其核心思想是利用`&lt;script&gt;`标签不受同源策略限制的特性,从而绕过浏览器的跨域限制。JSONP的基本工作原理是动态创建一个`...

    深入浅析Jsonp解决ajax跨域问题

    JSONP(JSON with Padding)是一种跨域数据交互协议,它允许网页从其他源获取数据,规避浏览器的同源策略限制。同源策略是浏览器为了安全考虑实施的一项策略,规定了只有域名、协议和端口完全相同的两个页面才能互相...

    浅析JSONP解决Ajax跨域访问问题的思路详解

    JSONP是一种使用JSON数据的方式,返回的不是JSON对象,是包含JSON对象的javaScript脚本。接下来通过本文给大家介绍jsonp解决ajax跨域访问问题的思路,非常不错具有参考借鉴价值,感兴趣的朋友一起看下吧

    浅析php中jsonp的跨域实例

    JSONP(JSON with Padding)是一种解决跨域请求限制的技术,它允许用户从不同的域名下加载并执行JavaScript代码。在Web开发中,由于同源策略的限制,出于安全考虑,浏览器会限制网页中的脚本如何与其它域进行交互。...

    浅析jsopn跨域请求原理及cors(跨域资源共享)的完美解决方法

    然而,为了实现跨域数据交换,开发者们发展出了两种常见方法:JSONP(JSON with Padding)和CORS(Cross-Origin Resource Sharing,跨域资源共享)。下面我们将深入探讨这两种技术的原理及其应用。 ### JSONP原理 ...

    浅析Spring4新特性概述

    - **JSONP支持**:支持JSON-P(JSON with Padding),方便跨域请求。 - **@JsonView支持**:与Jackson库结合,允许在序列化时指定视图。 5. **测试框架**: - **@sql标签**:简化了测试脚本的初始化。 - **...

    深入浅析同源策略和跨域访问

    2. JSONP(JSON with Padding):JSONP是一种较老的跨域解决方案,通过动态创建`&lt;script&gt;`标签来加载包含回调函数的JSON数据。由于脚本标签不受同源策略限制,服务器返回的脚本可以被当前页面执行。 3. 代理服务器...

    浅析jQuery中调用ajax方法时在不同浏览器中遇到的问题|angluo-javascript-109349.pdf

    - 当处理跨域JSON数据时,由于同源策略的限制,可能需要使用JSONP(JSON with Padding)。不过,不是所有浏览器都支持JSONP,因此在使用时需谨慎。 解决这些问题的关键在于对jQuery Ajax API的深入理解,以及对...

    js跨域问题浅析及解决方法优缺点对比

    什么是跨域? 概念:只要协议、域名、端口有任何一个不同,都被当作是不同的域。 代码如下: URL 说明 是否允许通信 http://www.a.com/a.js http://www.a.com/b.js 同一域名下 允许 http://www.a.com/lab/a.js ...

Global site tag (gtag.js) - Google Analytics