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

徹底解決 JSP 參數傳遞亂碼:POST、GET、超鏈接三大場景全攻略

     編輯:關於JSP

亂碼本質是編碼與解碼方案不一致。JSP 參數傳遞主要三種形式:表單 POST/GET 提交、URL 參數超鏈接、跨窗口 DOM 取值。本文深度剖析前兩者在 Tomcat 容器中的編解碼流程,提供分場景解決方案與全局過濾器最佳實踐。

前置知識:HTTP 請求報文與編碼流程

  • POST:參數在請求體,Content-Type 為 application/x-www-form-urlencoded,瀏覽器按頁面 charset(如 UTF-8)將中文編碼為 %E4%B8%96%E7%95%8C%E6%9D%AF 格式發送。
  • GET:參數拼接在 URL,同樣經 charset 編碼後發送。
  • Tomcat 預設以 ISO-8859-1 解碼請求體(POST)與 URL 參數(GET),導致中文亂碼。

場景一:表單 POST 提交

方案 1:單參數手動轉碼(通用但繁瑣)

String val = new String(request.getParameter("username").getBytes("ISO-8859-1"), "UTF-8");

方案 2:請求級設置 request.setCharacterEncoding("UTF-8")(推薦)

需在首次 getParameter 前調用,僅對 POST 有效(API 文檔限制)。

方案 3:全局過濾器(最佳實踐)

public class EncodingFilter implements Filter {
  private String charset;
  public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) {
    req.setCharacterEncoding(charset);
    chain.doFilter(req, resp);
  }
  public void init(FilterConfig cfg) { charset = cfg.getInitParameter("charset"); }
}
web.xml 映射 /*,一次性解決所有 POST 請求亂碼。

場景二:表單 GET 提交 / URL 參數

Tomcat 解碼 URL 參數使用 server.xml Connector 的 URIEncoding 屬性(預設 ISO-8859-1)。

方案 1:修改 Tomcat 配置

<Connector port="8080" URIEncoding="UTF-8" />

方案 2:啟用 useBodyEncodingForURI="true"

使 request.setCharacterEncoding 同時影響 URL 參數解碼,適合同一實例跑多編碼應用。

方案 3:手動編解碼(最可控)

發送端:URLEncoder.encode("世界杯", "UTF-8")
接收端:URLDecoder.decode(request.getParameter("param"), "UTF-8")

場景三:超鏈接直接帶中文參數

瀏覽器地址欄顯示中文實為視覺欺騙,實際發送經系統預設編碼(如 GBK→ISO-8859-1)。必須手動編碼:

<a href="./to.jsp?param=<%=URLEncoder.encode("世界杯","UTF-8")%>">Go</a>
接收端同場景二方案三。

總結決策表

場景推薦方案備註
POST 表單全局過濾器 request.setCharacterEncoding("UTF-8")一次配置,全站生效
GET 表單 / URL 參數Tomcat URIEncoding="UTF-8" + 過濾器需重啟 Tomcat
超鏈接帶中文手動 URLEncoder/URLDecoder最可控,不依賴容器配置

全鏈路 UTF-8 檢查清單

  1. JSP pageEncoding="UTF-8" / contentType="text/html;charset=UTF-8"
  2. Tomcat URIEncoding="UTF-8"
  3. 資料庫連接 URL characterEncoding=UTF-8
  4. 資料庫/表/欄位 utf8mb4
  5. Java 源文件編譯編碼 javac -encoding UTF-8

全鏈路統一 UTF-8,是徹底告別亂碼的唯一正道。

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