tomcat解決GET請求中文參數亂碼

一般,在使用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屬性
    }
    ...
}
相關文章
相關標籤/搜索