跟iframe脚本跨域调用中所面临的问题一样——js脚本不能跨域直接调用iframe(其它域)的脚本,在浏览器中数据的访问也存在跨域的限制:只要是跨域了,不管是什么服务(如WCF、),什么方式的请求(常用的Ajax请求),都会因为安全考虑被浏览器阻止(浏览器都会遵守基本的安全协议,否则没人改用)。但是浏览器这么做,也大大限制了Web应用跨域访问的灵活性,特别是对于大型应用要考虑的分布式部署访问的。
有人注意到了前端html页面中允许在<javascript src=“..”>中跨域”引用“脚本——注意是“引用”,不是直接“调用”。例如,jquery.js脚本框架广泛用于的各类网站,一般大家做Web应用程序时都会直接从所有人都公认的网站引用jquery.js,而不是将jquery放到自己的应用程序中。一方面利用浏览器缓存,减少对jquery的加载(加载时间),提高性能;另一方面,减少服务器的负载(对于大型应用会考虑到这一点负荷)。
<script type="text/javascript" src="http://www.xxx.com/1.7/jquery.js"></script>
“引用”的脚本,虽然不是直接调用,但也会在浏览器执行的。充分利用这一点漏洞,更确切地说充分利用这一特性,就解决了跨域访问数据的问题,并称之为JsonP技术。实际上,跟iframe脚本跨域调用一样,都是在js脚本允许范围内的非正常使用,却完美地解决了绕过了浏览器跨域的限制。
$.ajax({
dataType:'jsonp',
data:'id=10',
jsonp:'jsonp_callback',
url:'http://www.xxx.com/getdata',
success:function(){
//dosomething
},
});
之前使用Jquery的Ajax时,在数据返回类型中看到jsonp(Json with Padding),因为跟其它数据返回类型text、json、xml等放一起,还以为跟json一样一种数据格式。当时没怎么注意,以为是在json的基础上加了料。后来才发现,Jsonp只是一跨域访问数据解决方案,特此记录一下。