黑铁时代
Programing is not only one kind of technology, but also one kind of art.

同源策略

浏览器的同源策略,相信很多人并不陌生,www.domain1.com中的网页无法从www.domain2.com的服务器上面请求文件,这是浏览器处于安全考虑而设置的限制。

 

什么是JSONP

JSONP是为了实现浏览器的跨域请求而出现的一个很实用的方法,而且也比较容易实现。

JSONP的英文愿意是json with padding,可填充的json。json是JavaScript中最流行的数据格式,我们将使用它来传递来自其他域的数据,当然还不是这么简答就能实现。我们还要利用点其他东西,那就是很常用的<script>。虽然浏览器具有同源策略,但是对于动态脚本的插入却不受影响。我们通常会在页面中写很多<script>脚本,<script>的src通常是请求js脚本文件的url,当然我们也就可以利用这个src发送一个请求服务器资源的url,比如是http://www.domain1.com/getInfo?id=123&callback=showInfo这样的url。浏览器并不会阻止script脚本发送的url请求,这样当服务器收到请求就返回我们需要的json数据,比如是{ 'name': 'leo', 'age': 25 },然后脚本文件就变成<script>{ 'name': 'leo', 'age': 25 }</script>。其实这样子并没有多大的意义,单纯的json数据并不会执行,我们希望当数据返回之后执行一些操作去使用这些数据。此时你会发现刚才那个url中的callback=showInfo就派上用处了,服务器解析到get字符串中的callback字段是showInfo的时候,服务器就返回showInfo({'name':'leo', 'age':25});这样的字符串而不再是单纯的的json数据。于是浏览器中的脚步就变成了<script>showInfo({ 'name': 'leo', 'age': 25 });</script>,这是一个会运行的js代码,调用我们已经定义好的showInfo这个函数,就达到我们操作数据的目的。

 

PHP 端的代码可以这样写:

$jsonData = getJsonDataByiD( $_GET[ 'id' ] );

$funName = $_GET[ 'callback' ];

echo $funName . '(' . $jsonData . ');'; // 返回showInfo({ 'name': 'leo', 'age': 25 });字符串

 

当然这样的操作方式不是唯一的方式,你可以在服务器端定义自己需要的js代码,用同样的方式返回既可,也不一定非要使用json数据格式。

 

安全问题

由于浏览器对<script>的跨域请求没有太多限制,就导致了不谨慎的使用它会出现一下安全问题。如果请求的远程网站存在安全问题,自然黑客可以利用这个远程网站向你的网站注入一些有危险的js代码,造成安全问题。如果你的网站服务器不进行域验证或者安全性验证的话,其他网站可能向你的服务器索取一些敏感信息。

posted on 2012-06-20 23:56  黑铁时代  阅读(427)  评论(0编辑  收藏  举报