最近用springmvc的時(shí)候糾結某些問(wèn)題,原因是controller可以通過(guò)刷新重復提交,為了防止重復提交,我使用了重定向方法,返回一個(gè)新的ModeAndView(new RedirectView(Url)),無(wú)論你是否是在Url后面添加參數還是在在ModeAndView定義參數,最后的結果還是在Url后面拼接參數。
URL中文參數的糾結問(wèn)題的發(fā)現還是源于不同的測試環(huán)境,本地容器tomcat的service.xml設置了ENCODING=“utf-8”,而測試服務(wù)器沒(méi)有使用編碼容器。導致了jsp頁(yè)面獲取中文參數出現亂碼。
controller對中文參數的編碼,String mc = java.net.URLEncoder.encode("中文"UTF-8");return new ModeAndView(new RedirectView("Url?mc="mc));
jsp頁(yè)面用EL還是request.getParameter("mc"),如果在linux下容器沒(méi)有設置編碼為utf-8的會(huì )出現亂碼情況,而window下使用默認系統編碼,也會(huì )出現亂碼情況,所以容器需要設置編碼。另外一個(gè)情況就是容器不設置編碼,jsp頁(yè)面對參數的解碼。而我是這個(gè)處理不同版本的,
String ss = request.getParameter("mc");
if(ss!=null){
byte[] bs =ss.getBytes("ISO-8859-1");
for(int i = 0; i < bs.length; i++){
byte b = bs[i];
if(b==63){
break;
}else if(b>0){
continue;
}else if(b<0){
ss = new String(bs,"UTF-8");
break;
}
}
}
順便解釋下編碼的問(wèn)題,
* 用getBytes(encoding):返回字符串的一個(gè)byte數組
* 當b[0]為 63時(shí),應該是轉碼錯誤
* A、不亂碼的漢字字符串:
* 1、encoding用GB2312時(shí),每byte是負數;
* 2、encoding用ISO8859_1時(shí),b[i]全是63。
* B、亂碼的漢字字符串:
* 1、encoding用ISO8859_1時(shí),每byte也是負數;
* 2、encoding用GB2312時(shí),b[i]大部分是63。
* C、英文字符串
* 1、encoding用ISO8859_1和GB2312時(shí),每byte都大于0;
* <p/>
* 總結:給定一個(gè)字符串,用getBytes("iso8859_1")
* 1、如果b[i]有63,不用轉碼; A-2
* 2、如果b[i]全大于0,那么為英文字符串,不用轉碼; B-1
* 3、如果b[i]有小于0的,那么已經(jīng)亂碼,要轉碼。 C-1
*/
重定性request的參數會(huì )丟失,如果放在session必定冗雜,只能在URL參數方式,不知道是否還有更好的解決方式?
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請
點(diǎn)擊舉報。