日期:2014-05-16  浏览次数:20563 次

ajax 请求返回200 但是不进success--1
当前出现一问题就是我的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");