1. 程式人生 > >Spring MVC Controller中解析GET方式的中文引數會亂碼的問題

Spring MVC Controller中解析GET方式的中文引數會亂碼的問題

問題描述

在工作上使用Spring老是碰到一個問題,使用Controller處理GET方式的請求引數時,服務端得到的結果會碰到亂碼,之前翻閱了很多與Java EE相關的很多亂碼處理資料,不管是加過濾器還是統一檔案編碼,都沒能正確解決,後來設計介面時,一直採用先Base64,然後再作為引數傳過來的方式解決的。最近找到了根本的解決方案,順手記下來。

為何會亂碼

Spring MVC 是基於Servlet,在Http請求到達Servlet解析之前,GET過來的URL已經被Tomcat先做了一次URLDecode。Tomcat對GET方式預設的URL解碼結果是iso-8859-1而不是我認為的UTF-8(很奇怪為啥會這麼幹,開源專案不都是喜歡預設UTF-8的麼)。

解決方案

<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol" debug="0" useURIValidationHack="false" compression="on" compressionMinSize="2048" compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain" minProcessors="5" maxProcessors="1000" maxThreads="3000" minSpareThreads="512" maxSpareThreads="2048" acceptCount="3500" enableLookups="false" disableUploadTimeout="true" URIEncoding="UTF-8" useBodyEncodingForURI="true"
               connectionTimeout="20000"
                URIEconding="UTF-8"
               redirectPort="8443" />

解決方案也很簡單,除了平常在專案中web.xml裡配置的轉碼filter,jsp跟程式碼檔案統一編碼外,最關鍵的一點就是在Tomcat的conf目錄下的server.xml中配置 Connector的URIEconding=“UTF-8"屬性即可。
官方文件中對這個屬性的說明:

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.

這裡參考文件是Tomcat5.5的,親測對Tomcat7也管用。