spring mvc响应中文乱码本质是stringhttpmessageconverter默认用iso-8859-1编码,需从消息转换器层面统一配置utf-8:xml中在内注册含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)
在 <annotation-driven></annotation-driven> 中注册自定义的 StringHttpMessageConverter,明确指定 text/plain;charset=UTF-8 和 text/html;charset=UTF-8 等常用类型:
<annotation-driven><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></message-converters></annotation-driven>
⚠️ 注意:
register-defaults="true"表示保留 Spring 默认的其他 converter(如MappingJackson2HttpMessageConverter),只替换StringHttpMessageConverter。
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); // 插入最前,确保优先级最高
}
}</httpmessageconverter>
✅
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 编码逻辑)。 -
<message-converters></message-converters>没加register-defaults="true",导致 JSON 等 converter 失效。 -
supportedMediaTypes写成text/html;charset=utf-8(小写 utf-8),部分旧版本 Spring 会识别失败,建议统一用大写UTF-8。
? 补充:确保整个链路都是 UTF-8
响应不乱码 ≠ 全局无乱码。还需同步检查:
-
JSP/HTML 页面:
+<meta charset="UTF-8"> - IDE 文件编码:IntelliJ 或 Eclipse 设为 UTF-8(含项目、文件、Properties)
-
Tomcat server.xml(GET 请求参数):
<connector uriencoding="UTF-8" ...></connector> -
数据库连接 URL:
?useUnicode=true&characterEncoding=UTF-8
不复杂但容易忽略
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










