问题背景
最近橙子开发中遇到一个问题,Spring Boot的输出文档内容出现了title乱码,但是文档内容并没有乱码。效果如下图所示
橙子目前的项目是采用前后端分离开发的,前端使用的是基于umi封装的一套框架,后端是采用spring boot。但是不知道为什么集成到一起后项目出现乱码。
原因
看到这种问题究其原因肯定是编码导致的。
打开游览器查看一下请求的响应编码一看,果然是的。输出文档的编码并不是我指定的UTF-8
由于并不知道具体什么原因导致的,去网上找了一下比如设置http编码格式
spring.http.encoding.force=true
spring.http.encoding.charset=UTF-8
但是都不起作用。于是我开始debug源码之路。。。经过漫长的求索
最后我找到了输出内容编码异常的原因是由于org.springframework.http.converter.StringHttpMessageConverter类的defaultCharset导致的。
spring 设置输出内容默认编码格式的位置在AbstractHttpMessageConverter类的addDefaultHeaders方法。
protected void addDefaultHeaders(HttpHeaders headers, T t, @Nullable MediaType contentType) throws IOException {
....
Charset defaultCharset = getDefaultCharset();
if (defaultCharset != null) {
contentTypeToUse = new MediaType(contentTypeToUse, defaultCharset);
}
headers.setContentType(contentTypeToUse);
....
}
解决
基于原因已经找到了,解决起来就简单很多了。
直接设置好StringHttpMessageConverter类的默认编码格式即可。
@Configuration
public class WebMvcConfig extends WebMvcConfigurationSupport {
...
/**
* 修改StringHttpMessageConverter默认配置
* @param converters
*/
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters){
super.addDefaultHttpMessageConverters(converters);
StringHttpMessageConverter converter = (StringHttpMessageConverter)converters.get(1);
converter.setDefaultCharset(StandardCharsets.UTF_8);
}
}
其实还有一种解决方案,不过目前我还没尝试。
在controller层建立index.html文件的映射,在@RequestMapping里设置 produces = { “application/json;charset=UTF-8” }
好了最终输出文档的内容编码格式变成了UTF-8,乱码问题终于解决了。