Spring Boot接收请求的阿拉伯字符打印显示问号乱码如何解决
Spring Boot请求JSON阿拉伯字符显示为问号解决方案
问题本质为全链路字符编码不统一导致,普通Java运行时默认采用UTF-8编码,而Spring Boot的请求解析、容器配置、日志输出、JVM参数等环节可能存在非UTF-8编码配置,按以下步骤逐一排查即可解决:
- 配置Spring Boot全局强制UTF-8编码
在application.properties中添加如下配置:# 请求响应编码配置 server.servlet.encoding.charset=UTF-8 server.servlet.encoding.enabled=true server.servlet.encoding.force=true spring.http.encoding.charset=UTF-8 spring.http.encoding.enabled=true spring.http.encoding.force=true - 配置JSON序列化框架编码
手动指定Jackson的ObjectMapper采用UTF-8编码,避免JSON解析环节乱码:@Configuration public class JacksonConfig { @Bean public ObjectMapper objectMapper() { ObjectMapper mapper = new ObjectMapper(); mapper.setCharset(StandardCharsets.UTF_8); return mapper; } } - 调整外置容器编码(若使用外置Tomcat部署)
修改Tomcat安装目录下conf/server.xml文件,在Connector节点添加URIEncoding属性:
内置Tomcat部署无需调整,全局编码配置已覆盖该参数。<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8"/> - 添加JVM启动编码参数
应用启动时添加如下JVM参数,强制指定默认编码为UTF-8:-Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8 - 调整日志框架编码配置
检查日志框架(logback/log4j2)的输出编码配置,以logback为例,在appender的encoder节点指定charset:<encoder> <charset>UTF-8</charset> <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder>
配置完成后可先打印原始请求报文验证,排除前端传参时编码错误的问题。
内容的提问来源于stack exchange,提问作者Shubham Jain
相关产品推荐
相关产品推荐

