解决方法是使用JSON格式传递参数,但要注意JSON格式的后台获取的方法
正常的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)方式就可以获取到参数. |