跨域访问之jsonp

时间:2022-08-28 16:06:05

在进行网站开发的过程中经常会遇到跨域问题。跨域指的是一个域名的网页无法请求另一个域名的资源,它是由浏览器的同源策略造成的,同源是指,域名,协议,端口均相同,只要协议、域名、端口有任何一个不同,都被当作是不同的域。而 html的<script> 元素是一个例外,浏览器一般不对script,img等进行跨域限制,利用 <script> 元素的这个开放策略,网页可以得到从其他来源动态产生的 json 资料,而这种使用模式就是所谓的 jsonp。

本文讲解用jsonp解决跨域问题的原理。

jsonp是一种非官方跨域数据交互协议,该协议允许用户传递一个callback参数给服务端,然后服务端返回数据时会将这个callback参数作为函数名来包裹住json数据,这样客户端就可以随意定制自己的函数来自动处理返回数据了。简而言之,jsonp可以让网页从别的网域要资料。jsonp也叫填充式json,是应用json的一种新方法,只不过是被包含在函数调用中的json,如callback({"name","123"});

如:在a.com的网站上引用了b.com的一个b.js,但这样跨域的引用并不会产生错误,说明调用js文件时不受跨域的影响。

跨域访问之jsonp

 

在b.js里添加如下代码,能够执行,弹出“I from b”。

跨域访问之jsonp

 

在a.html文件里创建一段script脚本,写上一个函数a(),如下:

跨域访问之jsonp

 

然后在b.js里面调用a():

跨域访问之jsonp

 

结果发现成功弹出"from b"。

由此可以看出,b.com上的在b.js中的数据正确的传到了函数a中。前提是b.js中的函数名必须和a.html中js脚本中的函数名相同。为了能让b.com服务端知道这个函数名,只有通过url来传递了,加上一个callback=函数名来传递。

跨域访问之jsonp

 

b.com下的b.php如下:

跨域访问之jsonp

 

以上代码可以成功执行。知道了回调函数名,b.com服务端处理好数据,然后通过字符串拼接输出,js解释器解析并执行。

jquery中就已经提供了jsonp的支持,a.com下的index.html如下所示:

跨域访问之jsonp

jsonp:传递给请求处理程序或页面的,用以获得jsonp回调函数名的参数名(默认为:callback)

jsonpCallback:自定义的jsonp回调函数名称,默认为jQuery自动生成的随机函数名

如果这里自定了jsonp的回调函数,则success函数则不起作用;否则success将起作用

 

扩展:http://blog.csdn.net/u011897301/article/details/52679486

http://www.cnblogs.com/jiqing9006/p/5948231.html