日期:2014-05-16 浏览次数:20582 次
当前出现一问题就是我的Ajax请求返回的值有些牟盾,我在firefox 中跟踪调试的时候发现ajax请求服务器,返回结果是正常,状态码是200, 但是程序就是不进如到success方法体中,我的Ajax请求如下: //发送异步请求改变相应服务器的日志级别。 function changeLogLevel(url){ $.ajax({ url : url, async : true, dataType:"jsonp", jsonp:"callbackfun", success : function(data) { var res = data.content; if(res == "234"){ alert("日志级别更新失败"); }else if(res == "246"){ alert("日志级别更新成功"); } }, error : function(XMLHttpRequest,textStatus,errorthrow){ alert("XMLHttpRequest.status="+XMLHttpRequest.status); }, complete: function(data,status){ alert("data=="+data); } }); }
请求的页面资源如下: <%@ page import="*.cbb.log.service.ILogConfig"%> <%@ page import="*.cbb.log.service.impl.LogConfigImpl"%> <% String toChangeLevel = request.getParameter("to"); ILogConfig logConImpl = new LogConfigImpl(); boolean flag = logConImpl.updateLevel(toChangeLevel); if(flag){ out.write("success"); }else{ out.write("fail"); } %>
经过查找资料,发现不光客户端需要采用jsonp 方式请求资源,同时请求的服务端返回的值必须做相应的处理,上面的例子中换成如下方式即可: <%@ page import="*.cbb.log.service.ILogConfig"%> <%@ page import="*.cbb.log.service.impl.LogConfigImpl"%> <% String toChangeLevel = request.getParameter("to"); String callback = request.getParameter("callbackfun"); ILogConfig logConImpl = new LogConfigImpl(); boolean flag = logConImpl.updateLevel(toChangeLevel); if(flag){ out.write(callback+"({content:'success'})"); }else{ out.write(callback+"({content:'fail'})"); } %>
简单的ajax 跨域请求必须关注两点: 1. 客户端发送请求时dataType 必须是jsonp的方式。 2.服务器端返回值必须符合一些规范,即在请求中获取回调函数,将回调函数和json形式结果组合在一起才能完成。 注意如果客户端ajax中没有写jsonp: callbackfun 的话,在服务端就以如下的方式获取客户端的回调函数: request.getParameter("callback");