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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 22:38:15