Linux部署Spring Boot到外部Tomcat时多语言OTP短信乱码问题
解决Spring Boot部署外部Tomcat时多语言OTP短信乱码问题
以下是针对该问题的具体排查和解决步骤:
1. 补全Tomcat的UTF-8编码配置
如果仅配置了Connector的URIEncoding,还需补充以下设置:
- 修改Tomcat的
conf/server.xml,在Connector标签中添加:<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8" useBodyEncodingForURI="true"/> - 在Tomcat的
conf/web.xml中添加字符编码过滤器(若项目未自带):<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. 强制Spring Boot项目的编码规范
在项目的application.properties(或application.yml)中添加:
# 全局HTTP编码设置 spring.http.encoding.charset=UTF-8 spring.http.encoding.enabled=true spring.http.encoding.force=true spring.http.encoding.force-request=true spring.http.encoding.force-response=true # 多语言资源文件编码 spring.messages.encoding=UTF-8
3. 配置Tomcat启动的JVM编码参数
编辑Linux服务器上Tomcat的bin/catalina.sh文件,在文件开头添加:
export JAVA_OPTS="-Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8 $JAVA_OPTS"
这会强制JVM以UTF-8编码读取文件和处理系统字符,避免Linux默认编码(如ISO-8859-1)干扰。
4. 确保短信发送环节的编码正确
- 若使用
RestTemplate调用短信API,需明确设置消息转换器的编码:import org.springframework.http.converter.StringHttpMessageConverter; import java.nio.charset.StandardCharsets; import org.springframework.web.client.RestTemplate; RestTemplate restTemplate = new RestTemplate(); // 替换默认的String消息转换器,强制UTF-8 StringHttpMessageConverter utf8Converter = new StringHttpMessageConverter(StandardCharsets.UTF_8); restTemplate.getMessageConverters().removeIf(converter -> converter instanceof StringHttpMessageConverter); restTemplate.getMessageConverters().add(0, utf8Converter); - 若使用第三方短信SDK,查看其文档,找到编码设置参数并强制指定为UTF-8(例如部分SDK需设置
charset=UTF-8的请求参数)。
5. 验证项目构建时的编码配置
Maven项目
在pom.xml中添加编码配置,确保资源文件和源码以UTF-8打包:
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> </properties> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <version>3.3.1</version> <configuration> <encoding>UTF-8</encoding> </configuration> </plugin> </plugins> </build>
Gradle项目
在build.gradle中添加:
tasks.withType(JavaCompile) { options.encoding = 'UTF-8' } tasks.withType(ProcessResources) { filteringCharset = 'UTF-8' }
内容的提问来源于stack exchange,提问作者Ptese
相关产品推荐
相关产品推荐

