java后台服务器是apache-tomcat-6.0.37
正常的post请求(不包括ajax请求)在http头中的content-type为application/x-www-form-urlencoded,这时在java后台可以通过request.getParameter(name)的形式获取.但是通过原生ajax请求时,在java后台通过request.getParameter(name)的形式却无法获取到传入的参数.
原因是原生ajax请求时,在http头中的content-type为text/plain;charset=UTF-8.当请求到达tomcat服务器时,服务器只对application/x-www-form-urlencoded形式的http,post请求进行读取body体中的参数,并放到request的parameter中,对于原生ajax请求则直接忽略,不会读取body体中的参数,才导致request.getParameter(name)读取不到参数.
这样有两种方式解决
第一种,通过json传递数据,在java后台,用下面java代码读取RequestPayload的参数,就可以获取到传入的参数
// 前台
jQuery.ajax({
url: url, // 访问地址
type: "POST", // post提交
data: JSON.stringify(parm), // 对象参数转换json格式字符串
contentType: "application/json;charset=UTF-8", // http content type
dataType: "json", // 指定json格式
success: function (data) {
// do success
},
error: function (error) {
//do error
}
});
// 后台-获取到的是多个参数的json格式字符串,通过gson转换成map对象,即可以通过键值对方式去的想要的参数
public String getRequestPayload(HttpServletRequest req) {
StringBuilder sb = new StringBuilder();
try {
BufferedReader reader = req.getReader();
char[]buff = new char[1024];
int len;
while((len = reader.read(buff)) != -1) {
sb.append(buff,0, len);
}
} catch (IOException e) {
e.printStackTrace();
}
return sb.toString();
}
第二种, 在前台传递参数的时候用对象,并指定content-type为application/x-www-form-urlencoded
// 前台
var parm = {
param1 : "1",
param2 : "2"
};
jQuery.ajax({
url: url, // 访问地址
type: "POST", // post提交
data: parm, // 对象转json字符串参数
contentType: "application/x-www-form-urlencoded", // http content type
success: function (data) {
// do success
},
error: function (error) {
//do error
}
});
后台通过request.getParameter(name)方式就可以获取到参数.