1. 程式人生 > >GET和POST參數亂碼

GET和POST參數亂碼

lena 中文 圖片 tomcat nbsp fun 這樣的 方法 dia

當表單用get()方式請求時,表單內的數據參數是通過URL路徑傳送到Servlet的,瀏覽器的傳送編碼方式是可以調的, 技術分享圖片

技術分享圖片 老版本的tomcat的默認解碼方式是iso-8859-1方式,iso-8859-1這種方式時不支持中文的,這時會出現亂碼的問題,我們可以將變量再轉碼成utf-8這樣就不會再亂碼: String roleIdNew = new String(roleId.getBytes("iso-8859-1"),"UTF-8"); 這個時候就出現了另外的一個問題 我們現在的tomcat版本有的時候不是用iso-8859-1的作為默認的編碼方式 有的會用utf-8 這個時候我們就不知道服務器到底是適用的那一種編碼方式,這個時候我們最好的解決辦法是:在頁面就對要傳輸的變量做一下編碼 然後在後臺我們用就知道用哪種方式進行解碼了 例如: 頁面:
function saveRole(roleId,roleName,flag) {
var roleIdNew = encodeURI(encodeURI(roleId));
var title = "角色" + (flag==0?"新增":"修改");
var url = ‘/priv/goToAddRole.do?flag=‘+flag;
openDialog(350,300,‘new‘,title,flag==0?url:url+‘&roleId=‘+roleIdNew,‘‘);
}
encodeURI方法是將變量編碼成UTF-8的形式 然後我們在後臺就可以用UTF-8再解碼就行了 後臺:

@RequestMapping("/goToAddRole.do")
public ModelAndView goToAddRole() throws UnsupportedEncodingException {
ModelAndView mv = new ModelAndView("/newpages/priv/addRole");
String flag = request.getParameter("flag");//0:新增 1:修改
String roleId = request.getParameter("roleId");
if(StringUtil.isNotBlank(roleId)){
/*String roleIdNew = new String(roleId.getBytes("iso-8859-1"),"UTF-8");//中文亂碼問題*/
String roleIdNew = URLDecoder.decode(roleId,"UTF-8");//中文亂碼問題
mv.addObject("role",privRoleService.queryById(roleIdNew));
}
mv.addObject("flag",flag);
return mv;
}
我們發現在頁面上我們進行了兩次encodeURI方法來編碼 以為我們的數據傳遞到後臺的時候 tomcat會默認解碼一次 如果編碼一次的的話 還是可能出現亂碼的問題,所以我們編碼兩次 這樣tomcat自動解碼的時候就會自動抵消一次 我們再解碼就是正確的了
所以說表單最好是用post方式提交,而且這個時候,表單元素的傳遞是在HTTP信的正文中傳送到Servlet的,這樣比較安全。在post方式的亂碼問題中可以這樣解決,如果你想在Servlet中有這樣的操作String name=req.getParameter("hello");或者有這樣的操作System.out.println(req.getParameter("hello"));總之就是不進行out.write()操作,就在getParameter()方法之前加上一句req.setCharacterEncoding("utf-8");但是這個方法就只作用在post的HTTP信的正文,並且要放在getParameter()方法之前,如果你進行out.write()操作出現亂碼,這個就是服務器往瀏覽器寫信的時候出現了亂碼,這個時候在out.write()之前加上

response.setCharacterEncoding("utf-8");

response.setContentType("text/html;charset=utf-8");這兩句話要配合使用。

(這一種方法是不推薦的,因為我們不可能去修改人家服務器上的編碼方式,這個時候程序就會出錯)其實還有一個比較全局的方法就是在服務器中進行配置,在Service的service.xml中的包含連接端口的那一句加上:

技術分享圖片

技術分享圖片

這一句就算是get方式的亂碼也是能解決的。

在上傳文件的時候,通常要知道真是路徑,通常要知道上傳到磁盤上的哪一個文件,這個時候就用:技術分享圖片

技術分享圖片

req就是request,括號中參數就是項目當前目錄下的test文件夾,結果就是:

技術分享圖片

技術分享圖片

GET和POST參數亂碼