You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Tomcat/Spring REST服务输入编码异常跨平台问题求助

排查思路

1. 检查Tomcat的请求编码配置

Tomcat 8在不同系统下的默认编码处理存在差异,需强制指定UTF-8:

  • 修改conf/server.xml的Connector节点,添加编码配置:
    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443"
               URIEncoding="UTF-8"
               useBodyEncodingForURI="true"/>
    
  • 在conf/web.xml中配置Spring字符编码过滤器,确保请求体编码被正确处理:
    <filter>
        <filter-name>encodingFilter</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>encodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    

2. 强制JVM使用UTF-8编码

Linux系统的JVM默认编码可能不是UTF-8,需通过启动参数指定:

  • 编辑Tomcat启动脚本bin/catalina.sh,添加JVM参数:
    JAVA_OPTS="$JAVA_OPTS -Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8"
    
  • 可在代码中添加调试输出验证编码:
    System.out.println("file.encoding: " + System.getProperty("file.encoding"));
    System.out.println("sun.jnu.encoding: " + System.getProperty("sun.jnu.encoding"));
    

3. 配置Spring消息转换器编码

确保Spring的JSON解析器(Jackson)以UTF-8处理请求体:

  • 在Spring配置类中显式设置转换器编码:
    @Configuration
    public class WebConfig implements WebMvcConfigurer {
        @Override
        public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
            MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
            converter.setDefaultCharset(StandardCharsets.UTF_8);
            converters.add(converter);
        }
    }
    
  • 或在application.properties中添加全局配置:
    spring.http.encoding.force=true
    spring.http.encoding.charset=UTF-8
    spring.jackson.charset=UTF-8
    

4. 验证JDBC连接的编码参数

即使连接同一数据库,Linux端的JDBC连接可能未指定UTF-8,导致编码丢失:

  • 检查JDBC URL是否包含编码参数(以MySQL为例):
    spring.datasource.url=jdbc:mysql://host:port/db?useUnicode=true&characterEncoding=UTF-8
    
  • 确认数据库表及字段的字符集为utf8mb4(支持完整UTF-8字符集)。

5. 检查Linux系统环境编码

系统环境编码会影响JVM和Tomcat的编码行为:

  • 执行以下命令查看当前环境编码:
    echo $LANG
    echo $LC_ALL
    
  • 若输出不是UTF-8编码,可在Tomcat启动脚本或系统配置文件(如/etc/profile)中添加:
    export LANG=en_US.UTF-8
    export LC_ALL=en_US.UTF-8
    

6. 全链路调试编码一致性

在代码中添加日志,跟踪字符串从接收至存储的编码变化:

  • 在Controller接收参数时,打印字节数组验证编码:
    @PostMapping("/save")
    public ResponseEntity<?> saveName(@RequestBody User user) {
        byte[] nameBytes = user.getName().getBytes(StandardCharsets.UTF_8);
        System.out.println("Received name bytes: " + Arrays.toString(nameBytes));
        // 存储逻辑
        return ResponseEntity.ok().build();
    }
    
  • 在数据库存储前再次打印字符串内容,对比接收时的字节数组是否一致。

内容的提问来源于stack exchange,提问作者Tobia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 21:24:28