通過Ajax的post方式前端引數傳到後端與URLEncoder與URLDecoder編解碼問題
Ajax傳遞大量引數的時候是是以url的形式傳遞到後端的,即在url後面拼接問號加引數的格式拼成向後端訪問的引數。
在把請求引數給ajax之前一般會進行序列化:
例如var param = $('.queryForm').serialize();
然後,在Ajax裡data:param,把序列化的引數給ajax拼在url:url後面,組成新的url傳送到指定url的後端請求資料。
你在後端要獲取裡面的帶漢字的引數,發現一家被編碼成%加上16進位制字串形式了,。
確實,var param = $('.queryForm').serialize();已經把引數裡特殊字元按照URLEncoder的方式編碼了,
小在後端按照URLDecoder方式解碼出你要的引數。
String ss = "su.name=韓庚 su.age=12 su.class=A-*12_\tAA/tAA/nAA\nB&url=su/bol\\sole\\\\my.html?pass=bidd&sid=ui19280989890";
System.out.println(URLEncoder.encode(ss,"utf-8"));
//輸出:su.name%3D%E9%9F%A9%E5%BA%9A+su.age%3D12+su.class%3DA-*12_%09AA%2FtAA%2FnAA%0AB%26url%3Dsu%2Fbol%5Csole%5C%5Cmy.html%3Fpass%3Dbidd%26sid%3Dui19280989890
重要說明:URLEncoder.encode(str,"編碼"),URLDecoder.decode(str,"編碼");
前端encode與後端decode編碼一直,才能解析出正常的引數
encode特殊字串總結對照表:
= 編碼後 %3D
(空格)編碼後+(加號)
漢字編碼後:一串百分號拼上16進位制數格式的字元
*(星號)編碼後不變
.(點)編碼後不變
&編碼後%26
/(斜槓)編碼後%2F
\(反斜槓)編碼後%5C
\t編碼後%09
/t編碼後不變
/n編碼後不變
\n編碼後%0A
?編碼後%3F
!編碼後%21
(編碼後%28
)編碼後%29
#編碼後%23
%編碼後%25
注意:區別於經過escape()方法編碼:escape()編碼空格變成%20