搞定 jquery jsonp

【前言】

以前听过跨域要用到jsonp,今天早上突然有需求要用到jsonp,

这几天比较烦躁,在网上看例子,都是说的一堆一堆的的,但是前台后台的代码却没有,很是郁闷,

下午花点时间研究了下jsonp,搞清楚了是怎么回事。


【推荐文章】

这个文章比我说的好,推荐看看:

http://www.cnblogs.com/dowinning/archive/2012/04/19/json-jsonp-jquery.html


【不跨域ajax】

后台,

简单的传了一个json对象,其中msg属性的值为test:

	public void test(){
		renderJson(new QJson("test"));
	}

前台,

获取传过来的对象的msg属性:

	$(function(){
		$.ajax({
			url : 'http://localhost/com/test',
			data : {},
			type : 'get',
			async : false,
			dataType : 'json',
			success : function(json){
				alert(json.msg);
			}
		});
	});

页面,


【开始跨域】

将localhost换为具体的ip,由于地址请求的是localhost,而ajax中是具体ip,所以就跨域了:


【jsonp】

后台:

	public void test(){
		String callback = getPara("callback");// 获取页面的回调函数名称
		String json = JsonKit.toJson("ssss");// 将对象转为json字符串
		String res = callback + "(" + json + ")";// 其实就是调用客户端的callback函数,括号内为要传的对象
		
		renderJson(res);
	}

前台:

	$(function(){
		$.ajax({
			url : 'http://192.168.0.116/com/test',
			data : {},// 这里可以传一些参数
			type : 'get',// 一定使用get
			async : false,// 关掉异步
			dataType : 'jsonp',// jsonp类型
			success : function(json){// json就是后台传过来的对象
				alert(json.msg);
			}
		});
	});

界面:


【定制化jquery jsonp】

其实使用上面的方法完全可以满足需求,下面是一些定制:

后台:

	public void test(){
		String callback = getPara("mycallback");// 通过回调函数参数名获取回调函数名称,例如mycallback=test,最终获取的是test
		String json = JsonKit.toJson("ssss");// 将对象转为json字符串
		String res = callback + "(" + json + ")";// 其实就是:   test({json})
		
		renderJson(res);
	}

前台:

	$(function(){
		$.ajax({
			url : 'http://192.168.0.116/com/test',
			data : {},// 这里可以传一些参数
			type : 'get',// 一定使用get
			async : false,// 关掉异步
			dataType : 'jsonp',// jsonp类型
			jsonp : 'mycallback',// 回调函数  参数 名称  例如 callback=test,mycallback=test其中的callback和mycallback,默认为callback
			jsonpCallback: 'test',// 这个test需要和后台传过来的方法对应上,比如后台传test({json}),那这里就是test
			success : function(json){// json就是后台传过来的对象
				alert(json);
			}
		});
	});

界面:


【说明】

1.jsonp和jsonpCallback

jsonp:回调函数名称的参数名

jsonpCallback:回调函数名称

例如:url?jsonp=jsonpCallback

url?callback=test

2.jsonpCallback

页面不需要再写对应的方法了,jquery会封装到success中


【end】

最终好用的,简单的代码:

后台:

	public void test(){
		String callback = getPara("callback");
		String json = JsonKit.toJson("ssss");
		String res = callback + "(" + json + ")";
		
		renderJson(res);
	}

前台:

	$(function(){
		$.ajax({
			url : 'http://192.168.0.116/com/test',
			data : {},
			type : 'get',
			async : false,
			dataType : 'jsonp',
			success : function(json){
				alert(json);
			}
		});
	});


1、一个众所周知的问题,Ajax直接请求普通文件存在跨域无权限访问的问题,甭管你是静态页面、动态网页、web服务、WCF,只要是跨域请求,一律不准;   2、不过我们又发现,Web页面上调用js文件时则不受是否跨域的影响(不仅如此,我们还发现凡是拥有”src”这个属性的标签都拥有跨域的能力,比如[removed]、、<iframe>);   3、于是可以判断,当前阶段如果想通过纯web端(ActiveX控件、服务端代理、属于未来的HTML5之Websocket等方式不算)跨域访问数据就只有一种可能,那就是在远程服务器上设法把数据装进js格式的文件里,供客户端调用和进一步处理;   4、恰巧我们已经知道有一种叫做JSON的纯字符数据格式可以简洁的描述复杂数据,更妙的是JSON还被js原生支持,所以在客户端几乎可以随心所欲的处理这种格式的数据;   5、这样子解决方案就呼之欲出了,web客户端通过与调用脚本一模一样的方式,来调用跨域服务器上动态生成的js格式文件(一般以JSON为后缀),显而易见,服务器之所以要动态生成JSON文件,目的就在于把客户端需要的数据装入进去。   6、客户端在对JSON文件调用成功之后,也就获得了自己所需的数据,剩下的就是按照自己需求进行处理和展现了,这种获取远程数据的方式看起来非常像AJAX,但其实并不一样。   7、为了便于客户端使用数据,逐渐形成了一种非正式传输协议,人们把它称作JSONP,该协议的一个要点就是允许用户传递一个callback参数给服务端,然后服务端返回数据时会将这个callback参数作为函数名来包裹住JSON数据,这样客户端就可以随意定制自己的函数来自动处理返回数据了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

uikoo9

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值