一般,在使用Spring MVC框架的應用程序中,爲了解決中文參數亂碼的問題,都會添加以下過濾器配置:web
<filter> <filter-name>encodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
可是,在Tomcat下運行時,對於GET請求參數的處理和POST參數不一樣,會出現POST中文參數正常,可是GET請求中文參數亂碼的情形。
經過查看Tomcat相關源碼得知,爲了處理GET請求中的中文參數亂碼問題,必須明確設置Connector的URIEncoding屬性爲指定編碼。
具體配置以下:spring
<Connector port="8000" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="utf-8"/>
org.apache.catalina.connector.CoyoteAdapter類service()方法源碼片斷以下:apache
@Override public void service(org.apache.coyote.Request req, org.apache.coyote.Response res) throws Exception { Request request = (Request) req.getNote(ADAPTER_NOTES); Response response = (Response) res.getNote(ADAPTER_NOTES); if (request == null) { // Create objects request = connector.createRequest(); request.setCoyoteRequest(req); response = connector.createResponse(); response.setCoyoteResponse(res); // Link objects request.setResponse(response); response.setRequest(request); // Set as notes req.setNote(ADAPTER_NOTES, request); res.setNote(ADAPTER_NOTES, response); // Set query string encoding req.getParameters().setQueryStringEncoding(connector.getURIEncoding()); // 顯然,在處理GET查詢參數編碼時是獲取Connector的URIEncoding屬性 } ... }