Linux环境下解决Tomcat乱码问题,需从字符编码配置一致性入手,覆盖服务器、应用、系统多层面,具体方法如下:
server.xml:在conf/server.xml中找到<Connector>标签,添加URIEncoding="UTF-8"属性,确保GET请求参数正确解码。<Connector port="8080" protocol="HTTP/1.1"
URIEncoding="UTF-8" connectionTimeout="20000" redirectPort="8443" />
useBodyEncodingForURI:若需处理POST请求体编码,可添加useBodyEncodingForURI="true",但需注意与过滤器配置的兼容性。<%@ page contentType="text/html;charset=UTF-8" %>,确保页面输出为UTF-8。request.setCharacterEncoding("UTF-8"); // 处理POST请求参数
response.setCharacterEncoding("UTF-8"); // 设置响应头
response.setContentType("text/html;charset=UTF-8");
web.xml配置字符编码过滤器,统一处理所有请求。<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>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
echo $LANG确认系统默认编码为UTF-8,若为其他编码(如zh_CN.GBK),需修改为UTF-8:sudo dpkg-reconfigure locales # Debian/Ubuntu系统
sudo localedef -c -f UTF-8 -i zh_CN zh_CN.UTF-8 # CentOS/RHEL系统
export LANG=zh_CN.UTF-8 # 临时生效
bin/catalina.sh(或bin/startup.sh)中添加JVM参数-Dfile.encoding=UTF-8,确保Tomcat进程使用UTF-8编码。JAVA_OPTS="$JAVA_OPTS -Dfile.encoding=UTF-8"
logs/catalina.out等日志文件无乱码,确保logging.properties中ConsoleHandler.encoding已设置为UTF-8。通过以上步骤可系统性解决Linux下Tomcat的乱码问题,核心逻辑是从请求到响应的全链路统一UTF-8编码。