這兩天遇到了javaweb項目中亂碼的問題,想趁此機會搞搞清楚,順便把過程記錄下來,方便之後查看。html
首先新建一個動態javaweb工程,寫兩個jsp,index.jsp和a.jsp,以下圖java
啓動項目,因爲表單裏的值默認是中文,不出意外,均顯示亂碼web
咱們常規的作法就是在b.jsp頁面上的request內置對象中設置編碼:tomcat
再次提交,發現post請求正常了,可是get請求仍不正常app
這是怎麼回事呢?這個疑問先放着,繼續往下探索,將b.jsp中作一些改變:eclipse
再看post和get方式的提交結果:webapp
根據以上現象,咱們能夠得出兩個結論:jsp
1.request.setCharacterEncoding()方式的編碼過濾只對post請求起做用,get請求並無起做用;post
2.無論是post請求仍是get請求,項目中接收到的參數都是「ISO-8859-1」編碼的;測試
有些人就要問了,這個「ISO-8859-1」確定是哪裏配置的吧,ok,這個確實是可配置的,打開tomcat安裝目錄/conf/server.xml,找到:
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8"/>
將b.jsp復原至最初的狀態後再次測試(因爲使用eclipse自動部署僅重啓tomcat貌似沒法讓server.xml中的改動生效,爲獲得正確結果不影響判斷,今後處改成導出war包後加入tomcat的webapps目錄下手動啓動tomcat):
再次運行結果能夠發現,post請求爲亂碼,get請求好了:
這個結果驗證了以前的解釋,URIEncoding屬性的值表明着 Tomcat進行URL解碼時的字符集(默認爲"ISO-8859-1"),即get請求,但其並不影響post請求,post請求依據的字符編碼爲request.getCharacterEncoding()的值,默認也爲"ISO-8859-1"(但不清楚該默認值是否可更改),如此一來,此屬性和編碼過濾器配合使用,便可實現get和post請求均正常顯示。
.
另外介紹一個參數useBodyEncodingForURI,useBodyEncodingForURI:This specifies if the encoding specified in contentType should be used for URI query parameters, instead of using the URIEncoding.當該參數設置爲true時,get請求的編碼方式也將根據request.getCharacterEncoding()的值來肯定,和URIEncoding的區別在於可爲不一樣url路徑設置不一樣的編碼(感受通常人不會這麼幹,最可能是爲同一個tomcat下的不一樣項目設置不一樣的編碼),如此一來,將此方法設置爲true,並設置好編碼過濾,即request.setCharacterEncoding(),也可使整個項目的編碼統一。
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" useBodyEncodingForURI="true" />
參考博客(推薦閱讀):http://blog.csdn.net/hengyunabc/article/details/17053585