首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Servlet 中文亂碼問題深度解析與終極解決方案

     編輯:Java 綜合教學

Servlet 中文亂碼問題深度解析與終極解決方案

從 Tomcat 5.x 開始,GET 和 POST 請求的編碼處理機制不同,是導致中文亂碼的核心原因。本文系統梳理亂碼產生機制,提供從配置到代碼的多層次解決方案。

一、背景知識:Tomcat 編碼處理差異

  • GET 請求:Tomcat 忽略 request.setCharacterEncoding("UTF-8"),始終使用 ISO-8859-1 解碼 URI。
  • POST 請求:Tomcat 遵循 request.setCharacterEncoding("UTF-8") 設置,未設置時默認使用 ISO-8859-1。

二、GET 請求亂碼解決方案

1. 根本方案:修改 server.xml 配置 Connector

<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" 
           redirectPort="8443" URIEncoding="UTF-8" />

在 <Connector> 元素添加 URIEncoding="UTF-8",強制 Tomcat 以 UTF-8 解碼 URL 參數。

2. 局部方案:手動轉碼

String name = request.getParameter("parameter");
byte[] arr = name.getBytes("ISO-8859-1");
String nameAfterTransfer = new String(arr, "UTF-8");

先按 ISO-8859-1 取得字節數組,再按 UTF-8 重構字符串。適用於無法修改服務器配置的場景。

三、POST 請求亂碼解決方案

使用 Tomcat 內建 SetCharacterEncodingFilter

在 web.xml 配置全局過濾器,攔截所有請求統一設置編碼:

<filter>
  <filter-name>SetCharacterEncodingFilter</filter-name>
  <filter-class>org.apache.catalina.filters.SetCharacterEncodingFilter</filter-class>
  <init-param>
    <param-name>encoding</param-name>
    <param-value>UTF-8</param-value>
  </init-param>
  <init-param>
    <param-name>ignore</param-name>
    <param-value>true</param-value>
  </init-param>
</filter>
<filter-mapping>
  <filter-name>SetCharacterEncodingFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

ignore=true 表示強制覆蓋瀏覽器指定的編碼,確保統一使用 UTF-8。

四、GET/POST 統一解決方案:useBodyEncodingForURI

在 server.xml 的 <Connector> 中同時啟用:

<Connector ... URIEncoding="UTF-8" useBodyEncodingForURI="true" />

useBodyEncodingForURI="true" 使 Tomcat 使用請求體編碼(由 POST 設置的編碼)來解碼 URI,實現 GET/POST 統一 UTF-8 解碼。

五、實戰驗證:為什麼頁面聲明 UTF-8 仍亂碼?

測試場景:HTML 頁面 <meta charset="UTF-8">,POST 提交中文 "大" 到 Servlet。
結果:亂碼。
原因:Tomcat 不讀取頁面編碼聲明,請求頭無編碼信息時默認 ISO-8859-1。
結論:必須在服務端顯式設置編碼(request.setCharacterEncoding("UTF-8") 或過濾器),不可依賴前端聲明。

六、終極最佳實踐

  1. server.xml:useBodyEncodingForURI="true" + URIEncoding="UTF-8"
  2. 代碼/過濾器:request.setCharacterEncoding("UTF-8")(或配置 SetCharacterEncodingFilter)

雙重保障下,GET 與 POST 請求均能正確 UTF-8 解碼,徹底消除中文亂碼。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved