1. 程式人生 > >jquery通過ajax-json訪問java後臺傳遞引數,通過request.getParameter獲取不到引數的說明

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)方式就可以獲取到引數.