今天自己用java写了一个servlet,自运行一个服务开启8080端口,然客户端利用ajax 发post请求调用8080端口servlet。代码片段大致如下:
$.ajax({
type: "post",
url: "Default.aspx",
dataType: "text",
data: 'username='+username+'&password='+password,
success: function (data)
{
alert(data)
},
error: function (XMLHttpRequest,
textStatus, errorThrown) {
alert(errorThrown);
}
});
在ie、ff、chrome三大浏览器上测试,ie完全没有反映,ff和chrome执行的时候,发现后台其实是调用servlet,后台有东西输出。在网上查询,说是涉及到跨域访问,于是我将js所在的网页放到8080服务器下执行,三大浏览器访问,果然均返回“sucess”。说明问题确实是跨域造成的。
有文章说利用jsnop解决跨域问题。经过一番折腾,终于调通了,现总结如下,利用jsnop方式代码如:
要素一:dataType改成JSONP,必须要追加jsonp: "callbackparam",callbackparam可以自定义。这个是传给后台用的回调函数名字(是个参数),jsonpCallback写不写无所谓,不写的话,程序会随机生成一个函数名,如jQuery1720565933280158788_1372490746392,如果定义了,程序就会用定义的名字,如下面例子success_jsonpCallback。
$.ajax({ //一个Ajax过程
type: "post", //以post方式与后台沟通
url : "http://localhost:8080/LoadClas/loadcls", //与此php页面沟通
dataType:'JSONP',//从php返回的值以 JSON方式 解释
data: 'username='+username+'&password='+password,
jsonp: "callbackparam",//服务端用于接收callback调用的function名的参数
jsonpCallback:"success_jsonpCallback",//callback的function名称
success: function(json){//如果调用php成功
alert(json[0].msg)
},
error: function (XMLHttpRequest,
textStatus, errorThrown) {
alert(errorThrown);
}
});
要素二:后台要jsonp: "callbackparam"值获得。
String callbackparam = request.getParameter("callbackparam");
要素三:返回值要是json串
格式必须是:String jsonString = callbackparam + "([{'key':'value'}])" 这种形式。
这里需要特别注意的是很多文章都没有说清楚ajax参数里jsonp和jsonpCallback是怎么回事。
就我个人的从程序的理解来解释的话,之所以定义这两个参数,是为了给后台拼装json格式规则做准备。参见我的要素三,json前缀callbackparam就是通过这两个参数获得的。jsonp定义了request的key,即request.getParameter("callbackparam");jsonpCallback定义了key对应的value值,即success_jsonpCallback。所以ajax向后台请求的时候,原理上地址是“XXX.do?callbackparam=success_jsonpCallback&username=aaa&password=bbb”。
如果没有定义jsonpCallback,那么如我前面所述,程序会自动生成一个随机的函数名。输出的json串类似于
success_jsonpCallback([{'bbb':'ccc'}])或
jQuery1720565933280158788_1372490746391([{'bbb':'ccc'}])
本文介绍了一种使用JSONP解决跨域访问问题的方法,并详细解释了如何设置前端Ajax请求及后端处理流程。

被折叠的 条评论
为什么被折叠?



