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

JSP/Servlet 表單亂碼六大場景全解析:GET/POST、超鏈接、重定向、瀏覽器版本、響應輸出、Tomcat 容器級修正

     編輯:關於JSP

表單亂碼是 Java Web 開發高頻痛點,本質是「編碼不一致」。按請求類型、傳輸環節、響應環節劃分六大場景,逐一給出根因與標準修正代碼。

場景一:GET 請求參數亂碼(URL 參數)

根因:Tomcat 默認用 ISO-8859-1 解碼 URL 中的查詢字符串。

修正:

// 方案 A:Tomcat server.xml 全局生效(推薦)
<Connector port="8080" URIEncoding="UTF-8" />

-- 方案 B:代碼手動轉碼(不推薦,易漏)
String name = new String(request.getParameter("name").getBytes("ISO-8859-1"), "UTF-8");

場景二:POST 請求參數亂碼(請求體)

根因:容器默認 ISO-8859-1 解碼 Body。

修正(必須在獲取參數前調用):

request.setCharacterEncoding("UTF-8"); // 僅對 POST 有效
String name = request.getParameter("name"); // 正確

場景三:超鏈接傳遞中文參數亂碼

本質:超鏈接發起 GET 請求,同場景一。

修正:

  • Tomcat URIEncoding=UTF-8(現代瀏覽器自動 URL Encode)。
  • 舊瀏覽器(IE6/7)需手動 URLEncoder.encode(name, "UTF-8") 拼接鏈接,服務端 URLDecoder.decode。

場景四:重定向 sendRedirect 攜帶中文參數亂碼

本質:重定向是 302 + Location Header,瀏覽器發起新 GET 請求,同場景一/三。

修正:

String url = request.getContextPath() + "/target.jsp?name=" + URLEncoder.encode(name, "UTF-8");
response.sendRedirect(url);

場景五:低版本瀏覽器(IE6/7/8)特有亂碼

現象:中文參數長度為奇數時截斷/亂碼,因雙字節字符編碼邊界處理缺陷。

修正:

  • 強制全鏈路 UTF-8(Tomcat + Filter + JDBC + DB)。
  • 關鍵參數改用 POST + 隱藏表單域傳遞,避免 URL 暴露。
  • 不再支持 IE8 以下項目可直接忽略此場景。

場景六:響應輸出中文亂碼(Servlet/JSP 向瀏覽器寫數據)

根因:response.getWriter() 默認 ISO-8859-1,不支持中文。

修正(在獲取 Writer/Stream 前):

// 方式一:雙重設置(推薦)
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");

// 方式二:單行合併(優先級更高)
response.setContentType("text/html;charset=UTF-8"); // 隱含設置 charset

// JSP 頁面指令(編譯時生效)
<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" %>

全鏈路「零亂碼」標準化配置清單

層級配置位置關鍵設置
1. 瀏覽器頁面HTML <meta> / HTTP Headercharset=UTF-8
2. JSP 編譯page 指令pageEncoding=UTF-8, contentType=UTF-8
3. 請求解碼Filter (第一順位)request.setCharacterEncoding(UTF-8)
4. GET 參數Tomcat server.xmlURIEncoding=UTF-8
5. 響應編碼Filter / JSP / Servletresponse.setContentType(text/html;charset=UTF-8)
6. JDBC 連接連接串 / DataSourcecharacterEncoding=UTF-8 & useUnicode=true
7. 數據庫存儲建庫/建表CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci

一鍵式 Filter 實現(推薦放入所有項目)

@WebFilter(urlPatterns = "/*", dispatcherTypes = {DispatcherType.REQUEST, DispatcherType.FORWARD})
public class EncodingFilter implements Filter {
    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) {
        req.setCharacterEncoding("UTF-8");
        res.setCharacterEncoding("UTF-8");
        res.setContentType("text/html;charset=UTF-8");
        chain.doFilter(req, res);
    }
}

亂碼治理核心:**統一 UTF-8、Filter 前置、Tomcat 容器級修正 GET、數據庫 utf8mb4**。按清單逐項落地,徹底告別亂碼。

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