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

Spring Boot+Thymeleaf+Tomcat部署后表单西里尔字母存库变为问号排查

问题排查方向及解决方案

1. 优先修复编码过滤器注册失效问题

你的EncodingConfig类中filterRegistrationBean方法缺少@Bean注解,该过滤器根本不会被Spring容器加载。同时你使用了@EnableWebMvc注解,会直接关闭Spring Boot的MVC自动配置,默认自带的CharacterEncodingFilter也会失效,直接导致请求参数解析编码错误。
修复方式:给filterRegistrationBean方法添加@Bean注解即可。

2. 修正数据库连接配置错误

  • 你当前配置的spring.datasource.tomcat.connection-properties仅对Tomcat JDBC连接池生效,Spring Boot 2.x+默认使用HikariCP连接池,该配置完全不生效。
  • 优先在数据库连接URL上直接添加编码参数,示例:
spring.datasource.url=jdbc:mysql://你的数据库地址/库名?useUnicode=true&characterEncoding=utf8mb4&serverTimezone=Asia/Shanghai
  • 若确实使用Tomcat JDBC连接池,确认连接参数中characterEncoding设置为utf8mb4而非utf8,适配你数据库的utf8mb4排序规则。

3. 排查Linux服务器及JVM编码配置

  • 登录线上服务器执行locale命令,查看系统默认编码,若LANG参数不是xx_XX.UTF-8格式(如en_US.UTF-8、ru_RU.UTF-8),需要修改系统默认编码为UTF-8。
  • 在Tomcat的bin/setenv.sh文件中添加JVM启动参数,强制指定JVM编码:
export JAVA_OPTS="$JAVA_OPTS -Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8"

Linux默认编码如果是ISO-8859-1,JVM会自动继承该编码,西里尔字母转码时会被替换为问号。

4. 修正Tomcat自身编码配置

编辑Tomcat conf/server.xml文件,在HTTP请求对应的Connector标签中添加编码配置:

<Connector port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="8443"
           URIEncoding="UTF-8"
           useBodyEncodingForURI="true"/>

确保Tomcat解析请求URI和请求体时使用UTF-8编码。

5. 分层定位问题节点

如果以上配置修改后仍未解决,可通过日志分层定位:

  • 在Controller层打印接收到的西里尔字母参数的字节数组,如果字节包含大量0x3F(问号的ASCII码),说明问题出在请求解析层,继续排查过滤器、Tomcat配置。
  • 如果Controller层拿到的字节正确,在DAO层打印Hibernate执行SQL前的参数值,若此处已经变为问号,继续排查数据库连接、JVM编码配置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 14:30:02