Tomcat 的 Request.getParameter 是懒解析

本文仅讨论没有使用 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 值看名字就明白,判断参数是否被解析,如果没有被解析,则解析。

Tomcat 的 Request.getParameter 是懒解析_第1张图片

 

 

 解析参数的方法很长,有兴趣的自己看。所以说,需要先设置编码,否则你一旦调用 getParameter,再设置编码已经无效,因为参数已经解析完毕。

Tomcat 的 Request.getParameter 是懒解析_第2张图片

你可能感兴趣的:(Java)