JSP 與 Servlet 開發中,中文亂碼是經典痛點。雖然可在每個 JSP 加 pageEncoding、每個 Servlet 呼叫 request.setCharacterEncoding(),但易遺漏且維護困難。最佳實務是採用 Filter 統一攔截所有請求,在進入業務邏輯前強制設定編碼,一次設定、全域生效。
<%@ page pageEncoding="UTF-8" %>(或 GB2312/Big5)charset 設為相同編碼<meta charset>、JS 檔案編碼全數一致package com;
import java.io.IOException;
import javax.servlet.*;
public class CharsetFilter implements Filter {
private String charset = "UTF-8"; // 預設 UTF-8,可由 web.xml 覆寫
public void destroy() {}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// 關鍵:在讀取參數前設定編碼
request.setCharacterEncoding(charset);
// 可選:統一回應編碼
response.setCharacterEncoding(charset);
chain.doFilter(request, response);
}
public void init(FilterConfig config) throws ServletException {
String cfg = config.getInitParameter("charset");
if (cfg != null && !cfg.trim().isEmpty()) {
charset = cfg.trim();
}
System.out.println("字符過濾器啟動,編碼:" + charset);
}
}
<filter>
<filter-name>CharsetFilter</filter-name>
<filter-class>com.CharsetFilter</filter-class>
<init-param>
<param-name>charset</param-name>
<param-value>UTF-8</param-value> <!-- 與 JSP pageEncoding 一致 -->
</init-param>
</filter>
<filter-mapping>
<filter-name>CharsetFilter</filter-name>
<url-pattern>/*</url-pattern> <!-- 攔截所有請求 -->
</filter-mapping>
request.setCharacterEncoding() 必須在 request.getParameter() 或 request.getReader() 之前呼叫,Filter 天然滿足此條件。server.xml <Connector> 加 URIEncoding="UTF-8"。response.setCharacterEncoding() 並輸出 Content-Type: text/html; charset=UTF-8,避免瀏覽器誤判。characterEncoding=UTF-8,表/欄位 Collation 同步。pageEncoding="UTF-8"。web.xml 映射 /*。server.xml URIEncoding="UTF-8"。characterEncoding=UTF-8。<meta charset="UTF-8">。完成上述配置,專案中文亂碼問題將徹底解決,新增頁面無需重複設定,維護成本大幅降低。