AJax与Jsonp跨域访问问题小结(3)

在场景不一样的时候,我们需要变换使用Ajax。 1.拼装json数据。 2.序列化表格内容。var formParam = $("#form1").serialize(); 3.拼接URL 。。。 比如我们的数据中有特殊字符串(比如&)的时候拼接字符串不好用,可能会使提交内容不完整。这时候采用Json的形式会比较好用。

###利用jsonp实现跨域访问

什么是Jsonp?
和json有什么关系?
jsonp是怎么实现跨域访问的?

首先解释一下,为什么Ajax不能跨域访问,浏览器为什么限制跨域访问。

假设浏览器支持跨域访问,我们可以在A站通过XmlHttpRequest访问B站,这时候已经通过了B站的验证,得到了B站的Cookie,然后我们就可以随意访问B站了,这时候A站冒用B站的身份可以操作B站一切不需要进一步验证的操作,这是相当危险的。

我们如何获取跨域的数据呢?

我们发现Web页面上调用js文件时则不受是否跨域的影响(不仅如此,我们还发现凡是拥有”src”这个属性的标签都拥有跨域的能力,比如script、img、iframe等等。我们可以利用js的这一性质来获取我们想要的数据。

为了便于客户端使用数据,逐渐形成了一种非正式传输协议,人们把它称作JSONP,该协议的一个要点就是允许用户传递一个callback参数给服务端,然后服务端返回数据时会将这个callback参数作为函数名来包裹住JSON数据,这样客户端就可以随意定制自己的函数来自动处理返回数据了。

下面我们来看一下jsonp到底做了什么事情。

1、我们知道,哪怕跨域js文件中的代码(当然指符合web脚本安全策略的),web页面也是可以无条件执行的。 远程服务器remoteserver.com根目录下有个remote.js文件代码如下:

alert('我是远程文件');
本地服务器localserver.com下有个jsonp.html页面代码如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title></title> <script type="text/javascript" src="https://remoteserver.com/remote.js"></script> </head> <body> </body> </html>

毫无疑问,页面将会弹出一个提示窗体,显示跨域调用成功。 这就是最基本的jsonp的思想。

2、现在我们在jsonp.html页面定义一个函数,然后在远程remote.js中传入数据进行调用。   jsonp.html页面代码如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title></title> <script type="text/javascript"> var localHandler = function(data){ alert('我是本地函数,可以被跨域的remote.js文件调用,远程js带来的数据是:' + data.result); }; </script> <script type="text/javascript" src="https://remoteserver.com/remote.js"></script> </head> <body> </body> </html>

remote.js文件代码如下:

localHandler({"result":"我是远程js带来的数据"});
运行之后查看结果,页面成功弹出提示窗口,显示本地函数被跨域的远程js调用成功,并且还接收到了远程js带来的数据。 跨域访问数据的目的已经实现了,可是我怎么让远程js知道它应该调用的本地函数叫什么名字呢?

3.可以传一个参数过去告诉服务端“我想要一段调用XXX函数的js代码,请你返回给我”,于是服务器就可以按照客户端的需求来生成js脚本并响应了。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title></title> <script type="text/javascript"> // 得到航班信息查询结果后的回调函数 var flightHandler = function(data){ alert('你查询的航班结果是:票价 ' + data.price + ' 元,' + '余票 ' + data.tickets + ' 张。'); }; // 提供jsonp服务的url地址(不管是什么类型的地址,最终生成的返回值都是一段javascript代码) var url = "http://flightQuery.com/jsonp/flightResult.aspx?code=CA1998&callback=flightHandler"; // 创建script标签,设置其属性 var script = document.createElement('script'); script.setAttribute('src', url); // 把script标签加入head,此时调用开始 document.getElementsByTagName('head')[0].appendChild(script); </script> </head> <body> </body> </html>

在服务器端,我们获取callback,并且拼装好需要的js。

String callback = request.getParemeter("callback");
response.getWriter.print(callback + "(" + json +")");
这样返回给页面的内容是:

flightHandler({ "code": "CA1998", "price": 1780, "tickets": 5 });

4.Jquery也对jsonp实现了封装。(形式比较像ajax)

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wfygpz.html