問題背景
最近橙子開發中遇到一個問題,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,亂碼問題終於解決了。