今天公司开会刚好看到冯经理给我们演示的jq的时候,偶尔瞥到公司项目中也有用到jsonP技术来解决跨域请求的问题,一时兴趣大增,幸好之前有过研究,这次就做一次简单的复习吧。刚好今天发现EF不同版本之间还是有许多的不一致的地方,导致今天在用vs2012+mvc4+EF进行项目框架搭建的时候,老是找不到之前在vs2010中常用的方法类库,因此重装vs2010,这是一个漫长的过程,够我写一下jsonP的技术要点了~~~
JsonP是一个非官方的“协议”。主要用来跨域访问数据,使用的是服务器获得浏览器上的某个JS方法名称,并准备好Json数据,构造出一个调用js方法的js语法字符串。返回给浏览器。返回的数据因为是放在<script>标签里面,所以会被浏览器当做js代码来执行。这就达到了不同域名之间的跨域访问,
1:JsonP的用法一:
ajax异步对象只能访问本网站的资源,不能访问外部网站资源。例如:百度的网站创建的异步对象不能访问谷歌的相关资源。解决的方案:利用js的跨域性来解决:
<script src="http://www.google.com.cn/GetData.ashx"></script>;
而script标签就是一段js代码。当被请求的网站的资源被当做字符串返回给当前网站,在当前网站的都被当做js代码执行,那么在当前页面的js里面访问的到了。这就是JsonP技术。
1.1:在被请求的网站必须提供一个变量,如:context.Response.Write("var data="+jsonP);//jsonP表示你要请求的另一个服务器的上的数据以json的形式返回。
1.2:在当前页面可以通过:alert(var data )即可获得这个json数据。
2:JsonP的用方法二:
2.1:浏览器中js中有一个方法:function showHi(){alert("dd")};并通过URL传参的方式将方法名传递给服务端。
2.2:在服务端通过:string funName=context.Response.QuerySring["方法名"]获得js中的方法名,再返回回去:context.Write(funName +"("+jsonP+")");//相当于执行:showHi(jsonP);
图解如下: