InternalInputBuffer.parseRequestLine() 將字節解析為方法、URI、版本,URI 仍為字節數組(含 %XX)。CoyoteAdapter.convertURI() 將 URI 字節數組按 URIEncoding(默認 ISO-8859-1)解碼為字符串。request.getParameter() 觸發 Request.parseParameters(),對 Query String 或 POST Body 再次按 URIEncoding 解碼,填充參數 Map。默認 URIEncoding=ISO-8859-1 為單字節編碼,無法正確表示中文字符(雙字節),導致中文參數變為亂碼。
<Connector port="8080" protocol="HTTP/1.1"
URIEncoding="UTF-8"
useBodyEncodingForURI="true" />
URIEncoding="UTF-8":統一 URI 與參數解碼編碼。useBodyEncodingForURI="true":POST 請求體編碼由 request.setCharacterEncoding() 決定,覆蓋 URIEncoding。// Filter 中統一設置
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");