JSP 處理中文亂碼核心在於「編碼統一、設置及時」。本文梳理 POST 表單、跨頁傳值兩大高頻場景,給出最小代價修復方案。
<%@ page pageEncoding="UTF-8" %>
<%
// 必須在 request.getParameter() 之前調用
request.setCharacterEncoding("UTF-8");
%>
<form method="post">
姓名:<input name="name" /><br/>
性別:<input name="sex" />
<button type="submit">提交</button>
</form>
<%
String name = request.getParameter("name");
String sex = request.getParameter("sex");
out.println("姓名:" + name + ",性別:" + sex);
%>
三要素:
pageEncoding="UTF-8" —— JSP 編譯/輸出編碼request.setCharacterEncoding("UTF-8") —— 請求體解碼method="post" —— 參數在請求體,而非 URL登入後將用戶名、密碼存入 application 域,全局可讀:
<!-- login.jsp 處理登入 -->
<%@ page pageEncoding="UTF-8" %>
<%
request.setCharacterEncoding("UTF-8");
String name = request.getParameter("name");
String pwd = request.getParameter("password");
// 寫入 application 域(全局單例,慎用!)
application.setAttribute("globalUser", name);
application.setAttribute("globalPwd", pwd); // 明文密碼極不安全,僅示範
%>
<!-- other.jsp 任意頁面讀取 -->
<%@ page pageEncoding="UTF-8" %>
歡迎:<%=application.getAttribute("globalUser")%>
session 域(用戶級隔離),或簽發 JWT Token 客戶端攜帶| 現象 | 檢查項 | 修正 |
|---|---|---|
| POST 亂碼 | 缺 request.setCharacterEncoding | 在首個 getParameter 前加上 |
| GET 亂碼 | Tomcat 無 URIEncoding | server.xml Connector 加 URIEncoding="UTF-8" |
| 頁面顯示亂碼 | 缺 pageEncoding 或 contentType charset | JSP 指令雙設置 UTF-8 |
| 資料庫存入亂碼 | JDBC URL 缺編碼參數 | 加 ?useUnicode=true&characterEncoding=UTF-8 |
<%@ page pageEncoding="UTF-8" contentType="text/html;charset=UTF-8" %>
EncodingFilter
org.springframework.web.filter.CharacterEncodingFilter
encoding UTF-8
forceEncoding true
EncodingFilter /*
jdbc:mysql://localhost:3306/db?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
採用過濾器統一編碼,配合容器與數據庫層面 UTF-8,從源頭杜絕亂碼,業務代碼零侵入。