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

Tomcat 中 GET/POST 請求編碼處理差異與亂碼終極解決方案

     編輯:Java 綜合教學

從請求解析時序看 Tomcat 為什麼會在 POST 丟失 setCharacterEncoding

表單提交中文亂碼是 Web 開發經典坑。本文從 **瀏覽器編碼行為、Tomcat 解析源碼邏輯、Filter 統一處理方案** 三個層面,徹底講透 GET/POST 編碼差異根因,給出生產級解決方案。

一、瀏覽器發送行為差異

場景編碼方式說明
GET 請求URLEncode(頁面編碼)參數拼在 URL,編碼取決於頁面 Content-Type charset
POST 請求URLEncode(頁面編碼)參數在 Body,同樣按頁面編碼
AJAX (jQuery)強制 UTF-8無論頁面編碼,jQuery 固定用 UTF-8 發送
地址欄直接輸入瀏覽器自定Chrome 用 UTF-8,IE 用 GBK,極不穩定

二、Tomcat 解碼邏輯與關鍵時序

GET 請求

  • Tomcat 8+ 默認用 **ISO-8859-1** 解碼 URL;
  • 若在 server.xml 配置 <Connector URIEncoding="UTF-8"/>,則用 UTF-8 解碼;
  • 代碼修正姿勢:
    String val = request.getParameter("name");
    byte[] bytes = val.getBytes("ISO-8859-1");
    String real = new String(bytes, "UTF-8");

POST / AJAX 請求

  • Tomcat **延遲解析 Body**:首次調用 getParameter() 等方法時才觸發解析;
  • 解析時若未調用 setCharacterEncoding(),默認用 **ISO-8859-1**;
  • 核心規則:request.setCharacterEncoding("UTF-8") **必須在第一次 getParameter 之前調用**,否則無效!

三、實戰失敗案例還原

@WebServlet("/post")
public class TestPost extends HttpServlet {
    protected void service(HttpServletRequest req, HttpServletResponse resp) {
        String cmd = req.getParameter("cmd"); // ❌ 先調用 getParameter 觸發解析
        list(req, resp);
    }
    void list(HttpServletRequest req, HttpServletResponse resp) {
        req.setCharacterEncoding("utf-8"); // ❌ 已經晚了,解析已完成
        String name = req.getParameter("name"); // 亂碼
    }
}

四、三種標準解決方案

  1. Filter 統一設置(推薦):
    @WebFilter("/*")
    public class EncodingFilter implements Filter {
        public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) {
            req.setCharacterEncoding("UTF-8");
            resp.setCharacterEncoding("UTF-8");
            chain.doFilter(req, resp);
        }
    }
  2. Controller 入口第一行設置:確保在任何 getParameter 之前;
  3. 手動轉碼(不推薦,易漏):
    String name = req.getParameter("name");
    name = new String(name.getBytes("ISO-8859-1"), "UTF-8");

五、響應編碼同理

response.setCharacterEncoding("UTF-8"); // 自動設置 Content-Type: text/html;charset=UTF-8
response.setContentType("application/json;charset=UTF-8"); // API 場景

六、總結

亂碼本質是 **編碼/解碼不一致**。POST 請求因 Tomcat 延遲解析特性,**第一次 getParameter 前 setCharacterEncoding** 是鐵律。生產環境**務必用 Filter 全局攔截**,從源頭消除編碼問題,而非靠開發者自覺在每個 Controller 寫第一行代碼。

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