jquery通過ajax-json訪問java後臺傳遞引數,通過request.getParameter獲取不到引數的說明
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的引數,就可以獲取到傳入的引數
// 前臺
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)方式就可以獲取到引數.