Tomcat 的 Request.getParameter 是懶解析

罐裝麵包發表於2020-12-30

本文僅討論沒有使用 Spring 框架的原生開發,Spring 包含字元編碼過濾器,不存在本文提及的編碼問題。

通常,我們呼叫 Request.getParameter 方法獲取請求引數;

但當獲取請求體(body)的引數值時一般都是亂碼,因為 Tomcat 解析 body 的預設編碼是 ISO 8895-1。

 

而且,改變解析 body 的編碼需要在 getParameter 之前呼叫 Request.setCharacterEncoding。

看如下原始碼,注意到倒數第三行最後,this.request.getParameter(name)

public String getParameter(String name) {
    if (this.request == null) {
        throw new IllegalStateException(sm.getString("requestFacade.nullRequest"));
    } else {
        return Globals.IS_SECURITY_ENABLED ? (String) AccessController.doPrivileged(new RequestFacade.GetParameterPrivilegedAction(name)) : this.request.getParameter(name);
    }
}

 

 

繼續看方法,先判斷 this.parametersParsed,這個 boolean 值看名字就明白,判斷引數是否被解析,如果沒有被解析,則解析。

 

 

 解析引數的方法很長,有興趣的自己看。所以說,需要先設定編碼,否則你一旦呼叫 getParameter,再設定編碼已經無效,因為引數已經解析完畢。

相關文章