tomcat默認的在url傳輸時是用iso8859-1編碼。html
在使用get傳輸參數時,將參數中的中文轉換成url格式,也就是使用urlEncode和urlDecode來傳輸,使用這種方式就是把中文轉換成以%開頭的編碼在url中傳輸。web
使用這種方法時,要注意兩點。瀏覽器
1.前臺使用urlencode,在後臺相應的使用urldecode。tomcat
2.使用urlencode的內容是參數內空。千萬要注意,他是會把等於號等符號也給轉換了。因此,最好是先把參數傳換後再進行拼接。而不是把url拼接好再去轉換。服務器
配置tomcat,使用其在url傳輸過程當中使用相應的支持中文的編碼。通常國內的喜歡用gbk或gb2312。我我的建議使用utf-8框架
在tomcat的/conf/server.xml文件中,找到如下這一行。編碼
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />url
這行的意思也就是使用8080端口來接收html的請求。在這裏能夠加幾個參數來配置不一樣的效果。spa
URIEncoding="UTF-8" 設置url傳輸時對url內容的編碼格式rest
compression="on" 打開壓縮功能
compressionMinSize="2048" 啓用壓縮的輸出內容大小,這裏面默認爲2KB
noCompressionUserAgents="gozilla, traviata" 對於如下的瀏覽器,不啓用壓縮
compressableMimeType="text/html,text/xml" 壓縮類型
對於要解決亂碼來講,改爲如下就行
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8" />
轉:
通過分析,使我對TOMCAT的處理機制和HttpServletRequest有了更加深刻的認識。
1.filter過濾器中獲取參數值出現亂碼
下面是服務器端中的過濾器獲取參數的代碼:
當我在瀏覽器輸入「http//:localhost:8080/rest/test?foo=中國」時,瀏覽器會自動對"中國"進行URI轉碼,因爲使 用的中文語言環境,瀏覽器會將「中國」轉碼爲"%D6%D0%B9%FA"."D6D0","B9FA"分別"中","國"的GBK編碼。等價於在 JAVA語言中做了以下操做
傳遞到服務器後的URL實際爲「http//:localhost:8080/rest/test?foo=%D6%D0%B9%FA」。
因爲TOMCAT默認會對URL進行解碼,而且使用的是ISO-8859-1字符集,以下所示
由於編碼和解碼使用的是不一樣的字符集,因此解碼出來的字符串確定是不對的,故而使用以下方式獲取參數值時出現亂碼。
2.resteasy的service方法中獲取參數出現亂碼
resteasy中獲取到request參數foo的機制與前面的filter略有不一樣。foo參數的是值由resteasy框架進行相似以下處理後得到的。
經過getQueryString()方式得到的參數並無被TOMCAT解碼過,但被resteasy框架進行了解碼,當傳入參數不是以UTF-8編碼的話獲取到的參數就多是亂碼
3.總結
使用request.getParameter方式得到的參數是已經通過web服務器解碼的
使用request.getQueryString能夠得到未解碼的原始參數
對於tomcat解碼形成的亂碼問題能夠經過2種途徑解決
修改tomcat配置文件設置解碼方式
服務器端對於獲取到的參數進行new String(param.getBytes("ISO-8859-1"),"頁面指定編碼")轉換