@ResponseBody
形成答案时使用StringHttpMessageConverter
(如果错误则更正)。它默认具有ISO-8859-1编码。因此,为了让客户端接受utf-8编码的响应,仅仅放置一个过滤器来设置响应编码是不够的(ResponseBody
用它的默认编码覆盖它)。我看到三个选项:
1)最直接的:只需使用produces
in指定编码@RequestMapping
。我不喜欢这种方法,因为所有响应都必须在utf-8中,这意味着必须为所有带注释的处理程序手动指定它@ResponseBody
2)在初始化阶段更改mvc上下文的默认编码:
@Override
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
for (HttpMessageConverter converter : converters) {
if (converter instanceof StringHttpMessageConverter) {
((StringHttpMessageConverter) converter).setDefaultCharset(Charset.forName("UTF-8"));
}
}
虽然这可以满足我的要求,但我并不完全理解它如何影响框架的工作方式。我会以这种方式破坏一些东西吗?是的,而且演员看起来很丑
3)我还没有尝试过这种方法,但我认为有可能:如果响应编码不同,set HandlerInterceptor
(或aspect)会将来自处理程序的响应转换为utf-8 。涵盖了第一种和第二种方法的缺点,但会产生负载,这是服务器和客户端之间的额外步骤。
之前学习过spring,我开始觉得他能够为任何与业务逻辑无关的任务提供解决方案。但是这里似乎没有提供。还是我搜索不好?有没有更好的选择,如果没有,哪一个是最好的?
StringHttpMessageConverter
您可以使用所需的编码在配置中简单地声明相同的。其中一个构造函数StringHttpMessageConverter
接受一个参数Charset defaultCharset
。声明一个 HttpMessageConverter 类型的 bean 并返回new StringHttpMessageConverter(StandardCharsets.UTF_8)
。或使用任何其他方便的转换器。Spring Boot 自动配置
StringHttpMessageConverter
UTF-8 编码