tomcat8.0環境下解決get方法中文引數亂碼問題
環境:java 1.7 ,tomcat8.0
問題:tomcat8.0環境下,使用get方法提交由英文字母數字組合的內容顯示正常,但提交中文引數編碼亂碼,然而使用post方法程式一切正常,不出現亂碼問題。
原因:高版本tomcat 中,get 與 post 方法對引數內容編碼處理不同
解決方法:
修改 tomcat 的配置檔案,對 server.xml 中 Connector 元素增加如下的配置引數,這兩引數專門用來對編碼進行直接的配置,server.xml檔案具體修改如下,見加粗部分:
<Connector port="80" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" URIEncoding="GBK" useBodyEncodingForURI="true"
說明:
1)URIEncoding 用來設定通過 URI 傳遞的內容使用的編碼,tomcat將使用這裡指定的編碼對客戶端傳送的內容進行編碼。
也就是說,我們通過 get 方法提交的引數實際上都是通過 uri 提交的,都由這個引數管理,如果沒有設定這個引數,則 tomcat 將使用預設的 iso8859-1 對客戶端的內容進行編碼。
2)useBodyEncodingForURI 使用與 Body 一樣的編碼來處理 URI, 這個設定是為了與老版本tomcat保持相容,原來在 tomcat4 和 tomcat5 中對引數的處理是不一樣的,在 tomcat4 中 get 與 post 的編碼是一樣的,所以只要在過濾器中通過 request.setCharacterEncoding設定一次就可以解決 get 與 post 的問題。然而,在 tomcat高版本 中,get 與 post 的處理是分開進行的,對 get 的處理通過前面的 URIEncoding 進行處理,對 post 的內容依然通過request.setCharacterEncoding 處理,為了保持相容,就有了這個設定。
因此,將 useBodyEncodingForURI 設定為真後,就可以解決中文引數亂碼。
另外,tomcat還可以有頁面壓縮等設定選項,見下表:
<Service name="Catalina"> <Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="250" minSpareThreads="20"/> <Connector port="80" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" compression="on" compressionMinSize="2048" noCompressionUserAgents="gozilla,traviata" compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain,application/json,application/javascript,application/x-javascript" /> <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" executor="tomcatThreadPool"/>