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

Servlet 亂碼問題完整解決方案:GET/POST 請求編碼處理實戰

     編輯:Java 相關知識

HTTP 協議與編碼基礎

Servlet 亂碼本質是瀏覽器、伺服器、應用程式三方編碼不一致導致。理解 HTTP 請求結構是解決問題的關鍵:

  • GET 請求:參數在 URL 查詢字串中 → 請求行
  • POST 請求:參數在請求體實體內容中 → 請求體

POST 請求亂碼解決(較簡單)

在 service()、doGet() 或 doPost() 方法最開頭設置:

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) 
        throws ServletException, IOException {
    
    // 1. 設置請求編碼(解決請求體亂碼)
    req.setCharacterEncoding("UTF-8");
    
    // 2. 設置響應編碼(解決響應體亂碼)
    resp.setCharacterEncoding("UTF-8");
    
    // 3. 設置響應 Content-Type 告知瀏覽器編碼(關鍵!)
    resp.setContentType("text/html;charset=UTF-8");
    
    // 後續業務邏輯...
    String param = req.getParameter("name"); // 正確獲取中文參數
}

GET 請求亂碼解決(較複雜)

GET 參數在 URL 中,Tomcat 預設用 ISO-8859-1 解碼,需雙重處理:

方案一:Tomcat 8+ 修改 server.xml(推薦)

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

URIEncoding="UTF-8" 讓 Tomcat 直接用 UTF-8 解碼 URL,最徹底。

方案二:Tomcat 7 及以下使用 useBodyEncodingForURI

<Connector port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="8443"
           useBodyEncodingForURI="true" />

讓 URL 編碼跟隨請求體編碼(由 req.setCharacterEncoding() 決定)。

方案三:Java 代碼手動轉碼(通用補救)

// 獲取原始參數(ISO-8859-1 解碼後的錯誤字串)
String wrong = req.getParameter("name");

// 手動轉回 bytes 再用正確編碼解碼
String correct = new String(wrong.getBytes("ISO-8859-1"), "UTF-8");

前端配合:JavaScript 編碼發送

function submitForm() {
    // 關鍵:encodeURIComponent 進行 UTF-8 編碼
    var name = encodeURIComponent("大家好");
    window.location.href = "UserServlet?uname=zhangsan&realname=" + name;
}

對應後端 req.getParameter("realname") 即可正確獲取。

全鏈路編碼一致性檢查清單

層級配置項建議值
IDE/編輯器檔案編碼UTF-8
Java 源碼編譯編碼javac -encoding UTF-8
資料庫字符集/排序規則utf8mb4 / utf8mb4_unicode_ci
連線池連線 URL 參數characterEncoding=utf8&useUnicode=true
TomcatURIEncodingUTF-8
JSPpageEncodingUTF-8
HTMLmeta charsetUTF-8
JS發送前編碼encodeURIComponent()

Forward vs Redirect 補充

  • forward:伺服器內部轉發,請求對象不變,地址欄不變,同一 Web 應用內
  • redirect:客戶端重導向,新請求,地址欄改變,可跨域
  • 關鍵:執行 forward/redirect 後務必 return; 防止後續代碼繼續執行導致重複跳轉或異常
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved