Tomcat处理请求的编解码
文章目录
前言
本文只分析tomcat与spring结合chrome浏览器的使用
结论
- chrome发送请求时请求行以及post请求体中的编码为utf-8
- chrome发送请求时请求头中的编码一定是ISO-8859-1
- 前端发送请求时,指定请求体的编码为utf-8
- tomcat处理请求行的参数时默认编码是ISO-8859-1
- spring处理请求行的path参数时的默认编码是ISO-8859-1
protected String determineEncoding(HttpServletRequest request) {
String enc = request.getCharacterEncoding();
if (enc == null) {
enc = getDefaultEncoding();
}
return enc;
}
protected String getDefaultEncoding() {
return this.defaultEncoding;
}
private String defaultEncoding = WebUtils.DEFAULT_CHARACTER_ENCODING;
public static final String DEFAULT_CHARACTER_ENCODING = "ISO-8859-1";
- tomcat处理请求体的参数时默认编码是ISO-8859-1
- tomcat处理请求行中的参数以及请求体中的参数的编码是相同的
- tomcat中使用org.springframework.web.filter.CharacterEncodingFilter时,请求行的path参数、请求行的参数以及请求体的参数都是指定的encoding的编码格式
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
- 响应的编码需要设置响应头中的Content-Type,保证代码中的字符编码格式与Content-Type一致,浏览器根据Content-Type来解码
http请求的处理
tomcat处理请求行以及请求体的参数
处理请求的参数
protected void parseParameters() {
parametersParsed = true;
Parameters parameters = coyoteRequest.getParameters();
boolean success = false;
try {
// Set this every time in case limit has been changed via JMX
parameters.setLimit(getConnector().getMaxParameterCount());
// getCharacterEncoding() may have been overridden to search for
// hidden form field containing request encoding
// 获取解析请求行的参数以及请求体的参数, 先使用请求头中的 Content-Type 中的 charset 获取字符集解码
// 默认是 ISO-8859-1
Charset charset = getCharset();
boolean useBodyEncodingForURI = connector.getUseBodyEncodingForURI();
// 设置处理参数的字符集编码
parameters.setCharset(charset);
if (useBodyEncodingForURI) {
parameters.setQueryStringCharset(charset);
}
// Note: If !useBodyEncodingForURI, the query string encoding is
// that set towards the start of CoyoyeAdapter.service()
// 解析url后面的参数
parameters.handleQueryParameters();
if (usingInputStream || usingReader) {
success = true;
return;
}
String contentType = getContentType();
if (contentType == null) {
contentType = "";
}
int semicolon = contentType.indexOf(';');
if (semicolon >= 0) {
contentType = contentType.substring(0, semicolon).trim();
} else {
contentType = contentType.trim();
}
// 检查header content-type,如果不是multipart/form-data 或者
// application/x-www-form-urlencoded 的,则不解析body
if ("multipart/form-data".equals(contentType)) {
parseParts(false);
success = true;
return;
}
if( !getConnector().isParseBodyMethod(getMethod()) ) {
success = true;
return;
}
if (!("application/x-www-form-urlencoded".equals(contentType))) {
success = true;
return;
}
int len = getContentLength();
if (len > 0) {
int maxPostSize = connector