Spring MVC响应中文乱码本质是StringHttpMessageConverter默认用ISO-8859-1编码,需从消息转换器层面统一配置UTF-8:XML中在<mvc:annotation-driven>内注册含text/plain;charset=UTF-8等类型的StringHttpMessageConverter;Java配置中通过WebMvcConfigurer重写configureMessageConverters并add(0, converter)确保优先级;单接口可用produces临时修复。

Spring MVC 响应中文乱码,本质是 StringHttpMessageConverter 默认用 ISO-8859-1 编码写响应体(如 @ResponseBody 返回字符串、JSON),而浏览器按 UTF-8 解析,导致显示为 ??。
解决的关键不是在 Controller 里手动设 response.setContentType()——它会被 Spring 内部的 MessageConverter 覆盖。必须从 消息转换器层面统一配置 UTF-8。
✅ 响应体(ResponseBody)中文乱码的正确配置方式
1. XML 配置方式(spring-servlet.xml 或 applicationContext.xml)
在 <mvc:annotation-driven> 中注册自定义的 StringHttpMessageConverter,明确指定 text/plain;charset=UTF-8 和 text/html;charset=UTF-8 等常用类型:
<mvc:annotation-driven>
<mvc:message-converters register-defaults="true">
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/plain;charset=UTF-8</value>
<value>text/html;charset=UTF-8</value>
<value>application/json;charset=UTF-8</value>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>⚠️ 注意:
register-defaults="true"表示保留 Spring 默认的其他 converter(如MappingJackson2HttpMessageConverter),只替换StringHttpMessageConverter。立即学习“Java免费学习笔记(深入)”;
2. Java 配置方式(基于 WebMvcConfigurer)
如果你用 @EnableWebMvc 或继承 WebMvcConfigurationSupport,重写 configureMessageConverters:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
StringHttpMessageConverter stringConverter = new StringHttpMessageConverter(StandardCharsets.UTF_8);
stringConverter.setSupportedMediaTypes(Arrays.asList(
MediaType.TEXT_PLAIN,
MediaType.TEXT_HTML,
MediaType.APPLICATION_JSON
));
converters.add(0, stringConverter); // 插入最前,确保优先级最高
}
}✅
add(0, ...)很关键:避免被默认的 ISO-8859-1 converter 覆盖。
3. 单接口临时修复(不推荐用于全局)
仅对某个方法生效,加 produces 属性:
@GetMapping(value = "/hello", produces = "text/plain;charset=UTF-8")
@ResponseBody
public String hello() {
return "你好,世界";
}但该方式需每个接口都加,维护成本高,仅作调试或特殊场景用。
❌ 常见错误做法(无效或不可靠)
- 在 Controller 中写
response.setContentType("text/html;charset=UTF-8")
→ 会被StringHttpMessageConverter.writeInternal()忽略或覆盖。 - 只配了
CharacterEncodingFilter(它只管 request body 和 response header 的 charset 字段,不控制 response body 编码逻辑)。 -
<mvc:message-converters>没加register-defaults="true",导致 JSON 等 converter 失效。 -
supportedMediaTypes写成text/html;charset=utf-8(小写 utf-8),部分旧版本 Spring 会识别失败,建议统一用大写UTF-8。
? 补充:确保整个链路都是 UTF-8
响应不乱码 ≠ 全局无乱码。还需同步检查:
-
JSP/HTML 页面:
<%@ page contentType="text/html;charset=UTF-8" %>+<meta charset="UTF-8"> - IDE 文件编码:IntelliJ 或 Eclipse 设为 UTF-8(含项目、文件、Properties)
-
Tomcat server.xml(GET 请求参数):
<Connector URIEncoding="UTF-8" ... /> -
数据库连接 URL:
?useUnicode=true&characterEncoding=UTF-8
不复杂但容易忽略

















