javaWeb項目編碼問題探索

這兩天遇到了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" />

在此節點後追加屬性URIEncoding="UTF-8":

<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8"/>

查看$TOMCAT_HOME/webapps/tomcat-docs/config/http.html這個說明文檔,有以下說明:  URIEncoding:This specifies the character encoding used to decode the URI bytes, after %xx decoding the URL. If not specified, ISO-8859-1 will be used.  也就是說,若是沒有設置URIEncoding, Tomcat默認是按ISO-8859-1進行URL解碼,ISO-8859-1並未包括中文字符,這樣的話中文字符確定就不能被正確解析了。

將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

    http://www.ruanyifeng.com/blog/2010/02/url_encoding.html

                  http://blog.csdn.net/superch0054/article/details/9325793

相關文章
相關標籤/搜索