使用getJSON解决jquery跨域问题
2013-02-22 16:06
686 查看
Ajax的应用中,由于安全的问题,浏览器默认是不支持跨域调用的。传统解决的方法,包括:(参考http://bob.pythonmac.org/archives/2005/12/05/remote-json-jsonp/)
Local proxy:Needs infrastructure (can't run a serverless client) and you get double-taxed on bandwidth and latency (remote - proxy - client).Flash:Remote host needs to deploy a crossdomain.xml file, Flash is relatively proprietary and opaque to use, requires learning a one-off moving target programming langage.Script tag:Difficult to know when the content is available, no standard methodology, can be considered a "security risk".
以上方法都各有缺陷,都不是很好多解决方案。后来出现了一种叫JSON with Padding 的技术,简称 JSONP .(原理参考http://bob.pythonmac.org/archives/2005/12/05/remote-json-jsonp/),应用JSONP可以实现JSON数据的跨域调用。非常的幸运,JQuery1.2以后支持JSONP的应用。下面侧重说明在JQuery 中,Json的跨域调用。
应用JSONP实现Json数据跨域调用,需要服务器端与客户端的合作完成。引用Jquery 官方的例子,客户端掉用如下:
$.getJSON("http://api.flickr.com/services/feeds/photos_public.gne?tags=cat&tagmode=any&format=json&jsoncallback=?",
function(data){
$.each(data.items, function(i,item){
$("<img/>").attr("src", item.media.m).appendTo("#images");
if ( i == 3 ) return false;
});
});
注意这里调用的地址中jsoncallback=?是关键的所在!其中,符号会被Query自动替换成其他的回调方法的名称,具体过程和原理我们这里不理会。我们关心的是jsoncallback=?起什么作用了?原来jsoncallback=?被替换后,会把方法名称传给服务器。我们在服务器端要做什么工作呢?服务器要接受参数jsoncallback,然后把jsoncallback的值作为JSON数据方法名称返回,比如服务器是JSP,我们会这样做:
...
string jsoncallback=Request.QueryString["jsoncallback"];
...
Response.Write(jsoncallback+"({\"account\":\"XX\",\"passed\":\"true\",\"error\":\"null\"})");
Jquery 取得的数据可能如下:
JQUET0988788({"account":"XX","passed":"true","error":"null"})
总结,用JSONP要做两件事:
1/请求地址加参数:jsoncallback=?
2/服务器段把jsoncallback的值作为方法名传回来,如JQUET098788(...)
Local proxy:Needs infrastructure (can't run a serverless client) and you get double-taxed on bandwidth and latency (remote - proxy - client).Flash:Remote host needs to deploy a crossdomain.xml file, Flash is relatively proprietary and opaque to use, requires learning a one-off moving target programming langage.Script tag:Difficult to know when the content is available, no standard methodology, can be considered a "security risk".
以上方法都各有缺陷,都不是很好多解决方案。后来出现了一种叫JSON with Padding 的技术,简称 JSONP .(原理参考http://bob.pythonmac.org/archives/2005/12/05/remote-json-jsonp/),应用JSONP可以实现JSON数据的跨域调用。非常的幸运,JQuery1.2以后支持JSONP的应用。下面侧重说明在JQuery 中,Json的跨域调用。
应用JSONP实现Json数据跨域调用,需要服务器端与客户端的合作完成。引用Jquery 官方的例子,客户端掉用如下:
$.getJSON("http://api.flickr.com/services/feeds/photos_public.gne?tags=cat&tagmode=any&format=json&jsoncallback=?",
function(data){
$.each(data.items, function(i,item){
$("<img/>").attr("src", item.media.m).appendTo("#images");
if ( i == 3 ) return false;
});
});
注意这里调用的地址中jsoncallback=?是关键的所在!其中,符号会被Query自动替换成其他的回调方法的名称,具体过程和原理我们这里不理会。我们关心的是jsoncallback=?起什么作用了?原来jsoncallback=?被替换后,会把方法名称传给服务器。我们在服务器端要做什么工作呢?服务器要接受参数jsoncallback,然后把jsoncallback的值作为JSON数据方法名称返回,比如服务器是JSP,我们会这样做:
...
string jsoncallback=Request.QueryString["jsoncallback"];
...
Response.Write(jsoncallback+"({\"account\":\"XX\",\"passed\":\"true\",\"error\":\"null\"})");
Jquery 取得的数据可能如下:
JQUET0988788({"account":"XX","passed":"true","error":"null"})
总结,用JSONP要做两件事:
1/请求地址加参数:jsoncallback=?
2/服务器段把jsoncallback的值作为方法名传回来,如JQUET098788(...)
相关文章推荐
- 使用getJSON解决jquery跨域问题
- 前端使用Jquery的getJSON方法,后台使用PHP,解决IE和火狐Firefox中存在的跨域ajax请求问题。
- 黄聪:使用$.getJSON解决ajax跨域访问 JQuery 的跨域方法(服务器端为wordpress程序)
- jQuery中ajax的使用和缓存问题解决 $getjson 与$get都会被IE缓存
- 夺命雷公狗jquery---62通过$.getJSON来解决Ajax跨域请求问题
- 使用jquery的getjson()遇到的跨域访问问题(二)——使用拦截器进行数据封装
- 使用jquery的getjson()遇到的跨域访问问题
- jquery使用jsonp解决json跨域访问的问题
- jQuery解决IE6、7、8不能使用 JSON.stringify 函数的问题
- 【TaoTao】使用JQueryJsonp 完美解决JS跨域问题
- jQuery UI Autocomplete 使用 ajax 方法传输Json数据出现乱码问题的解决
- jquery php json cookie ajax 解决跨域的问题
- jQuery.get、jQuery.getJSON、jQuery.post无法返回JSON问题的解决方法
- 勤于思考:jquery.getJSON的缓存问题的解决方法
- jQuery getJSON 处理json数据的代码 解决ajax跨域返回json 数据问题
- 使用 ajax json(getJSON)从服务器读取数据,在IE下不更新问题解决
- jquery使用$.getJson()跨域大数据量请求方法
- WebWorks中使用JQuery的getJSON方法进行跨域访问
- Struts2使用jQuery JSONP解决跨域问题
- jQuery.getJSON的缓存问题的解决办法