1. 程式人生 > >tomcat8.0環境下解決get方法中文引數亂碼問題

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"/>