關於AJAX/GET請求亂碼的問題
阿新 • • 發佈:2019-01-01
AJAX的GET請求引數中若存在中文等非“ASCII字元”時,服務端在解析請求引數時,如果僅通過request.getParameter(引數key)方法獲取引數值,而不進行相關處理,獲得值中就會出現亂碼的問題。如以下請求:
- GET請求時
param["taskName"] = "任務1"; $.ajax({ url : nfmTools.remoteAddress + "doGET", data : param, cache : false, async : false, type : 'GET', dataType : 'json', success : function(rsp) { });
@RequestMapping(value = "doGET", method = RequestMethod.GET)
@ResponseBody
public void doGet(HttpServletRequest request){
String name = request.getParameter("taskName");
System.out.println(name);
}
- POST請求時
param["taskName"] = "任務1"; $.ajax({ url : nfmTools.remoteAddress + "doGET", data : param, cache : false, async : false, type : 'POST', dataType : 'json', success : function(rsp) { });
@RequestMapping(value = "doPost", method = RequestMethod.POST)
@ResponseBody
public void doPost(HttpServletRequest request){
String name = request.getParameter("taskName");
System.out.println(name);
}
從上面的示例可以看到:傳送get請求時,引數taskName的值是“任務1”,但是java程式碼中獲取的值確實亂碼,而傳送post請求時,則不存在亂碼的問題,為什麼會出現這種情況呢?
因為:
(1) 使用GET方法時,查詢字串(鍵值對)被附加在URL地址後面一起傳送到伺服器,如/test/demo.jsp?name1=value1&name2=value2,而在url中的字元只能是ASCII碼,對於非ASCII碼的字元,將無法表示,所以就會出現亂碼。
(2) 使用POST方法時,查詢字串在POST請求的Header中存在,和HTTP請求一起傳送到伺服器,沒有隻能是ASCII碼的限制。
瞭解了HTTP GET請求和POST請求的區別之後,如何解決GET請求是的亂碼問題呢?
方法一、客戶端不做處理,服務端轉碼
String content = new String(request.getParameter("xxxx").getBytes("ISO-8859-1"), "UTF-8");
方法二、客戶端進行encodeURI轉碼,服務端解碼
js:
var param = {};
var name = "任務1";
param["name"] = encodeURI(name);
$.ajax({
url : remoteURL,
data : param,
cache : false,
async : false,
type : 'GET',
dataType : 'json',
success : function(rsp)
{
});
java:
public boolean doGET(HttpServletRequest request){
String name = request.getParameter("name");
System.out.println(name);
name = URLDecoder.decode(name, "UTF-8");
System.out.println(name);
}
列印結果為:
%E4%BB%BB%E5%8A%A11
任務1
方法三、客戶端進行encodeURIComponent轉碼,服務端解碼
js:
var param = {};
var name = "任務1";
param["name"] = encodeURIComponent(name);
$.ajax({
url : remoteURL,
data : param,
cache : false,
async : false,
type : 'GET',
dataType : 'json',
success : function(rsp)
{
});
java: public boolean doGET(HttpServletRequest request){
String name = request.getParameter("name");
System.out.println(name);
name = URLDecoder.decode(name, "UTF-8");
System.out.println(name);
}