1、使用POST方式傳參
sPara += sName + "=" + encodeURI(encodeURI(sValue)) + "&"; xmlHttp.onreadystatechange = handleStateChange; xmlHttp.open( "POST" , sURL , true ); xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded"); xmlHttp.send(sPara);
注意,這裡我使用了兩次encodeURI,encodeURI(encodeURI(sValue))
String providerName = request.getParameter("providerName"); //post 傳遞的時候,一定是用utf8編碼的providerName = URLDecoder.decode(providerName , "utf-8");
分析:當調用request.getParameter()函數時,會自動進行一次URI的解碼過程,調用時內建的解碼過程會導致亂碼出現。而URI 編碼兩次後,request.getParameter()函數得到的是原資訊URI編碼一次的內容。再用可控的解碼函數 java.net.URLDecoder.decode()就可解出原始的正確的資訊。
2、使用GET方式傳參
GET方式要比POST方法好轉碼,但是它有字元限制
有兩種方式
一、在後台添加unescape方法進行解碼
前台使用javascript的escape方法進行轉碼
public static String unescape (String src){ StringBuffer tmp = new StringBuffer(); tmp.ensureCapacity(src.length()); int lastPos=0,pos=0; char ch; while (lastPos<src.length()) { pos = src.indexOf("%",lastPos); if (pos == lastPos) { if (src.charAt(pos+1)=='u') { ch = (char)Integer.parseInt(src.substring(pos+2,pos+6),16); tmp.append(ch); lastPos = pos+6; } else { ch = (char)Integer.parseInt(src.substring(pos+1,pos+3),16); tmp.append(ch); lastPos = pos+3; } } else { if (pos == -1) { tmp.append(src.substring(lastPos)); lastPos=src.length(); } else { tmp.append(src.substring(lastPos,pos)); lastPos=pos; } } } return tmp.toString(); }
二、直接使用encodeURI進行轉碼
前台直接使用encodeURI進行轉碼
在後台使用request.getParameter("name");就可以得到未經處理資料。
原因可能是,當調用request.getParameter()函數時,程會自動進行一次URI的解碼過
這幾種方式都主要用於,前台向後台傳資料,後台向前台轉資料沒有描述
註:文章主要用於自己的經驗積累,所以沒有寫的太細,如有人來看,看不懂也不要罵我啊