Spring MVC与Thymeleaf POST方法提交非拉丁字符存入MySQL后乱码问题
故障原因
你遇到的乱码问题核心出在Spring MVC的请求参数解析环节未强制使用UTF-8编码:默认Spring MVC会采用ISO-8859-1编码解析前端提交的请求参数,你提交的UTF-8格式非拉丁字符被错误转码后存入数据库,最终读取展示时就会出现乱码。你已经排查的前端配置、Thymeleaf静态渲染、数据库本身编码都没问题,所以问题集中在服务端请求解析和数据库连接两个环节。
解决方案
1. 配置Spring MVC字符编码过滤器
基于web.xml配置(传统Spring MVC项目)
在web.xml中优先添加CharacterEncodingFilter,强制请求和响应都使用UTF-8编码:
<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>forceRequestEncoding</param-name> <param-value>true</param-value> </init-param> <init-param> <param-name>forceResponseEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
基于Java Config配置(注解/ Spring Boot项目)
注册编码过滤器的Bean:
@Bean public FilterRegistrationBean<CharacterEncodingFilter> encodingFilter() { CharacterEncodingFilter filter = new CharacterEncodingFilter(); filter.setEncoding("UTF-8"); filter.setForceRequestEncoding(true); filter.setForceResponseEncoding(true); FilterRegistrationBean<CharacterEncodingFilter> registrationBean = new FilterRegistrationBean<>(filter); registrationBean.addUrlPatterns("/*"); registrationBean.setOrder(1); // 确保过滤器优先级最高 return registrationBean; }
2. 修正MySQL数据库连接配置
检查你的数据源连接URL,确保添加了Unicode和编码参数,避免JDBC驱动层转码错误:jdbc:mysql://localhost:3306/你的库名?useUnicode=true&characterEncoding=UTF-8
如果是MySQL 8.0+版本,可额外补充时区参数避免其他异常:jdbc:mysql://localhost:3306/你的库名?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useSSL=false
3. 验证排查(可选)
在Controller接收姓名参数的位置打印日志,若此时参数已经乱码说明是过滤器配置未生效,若参数正常则说明是数据库连接层的编码问题,可快速定位故障点。
内容的提问来源于stack exchange,提问作者gurmigou
相关产品推荐
相关产品推荐

