解决FastJson之JSONP中文乱码
当SpringMvc使用fastjson的@ResponseJSONP返回jsonp给前端时,中文会出现乱码。
JSONP中文乱码解决方法
○问题描述
在SpringMvc中使用fastjson提供的@ResponseJSONP
注解返回JSONP数据时,会出现中文乱码问题,根本原因在于实际返回类型为application/javascript
且没有指定charset=utf-8
,即使设置@RequstMapping
的producer
属性为application/javascript;charset=utf-8
也无法得到解决。关于此问题,Github上存在一个两年前的issue#1689,至今仍然OPEN,开发者仍不解决这个问题!
○解决方法
在issue中开发者提到:
neil4dong commented on 12 Jul 2019
@kakakeven 最终响应的Charset不取决于JSONPResponseBodyAdvice 的操作, JSONPResponseBodyAdvice 仅仅只是将返回结果做了封装, 实际响应Charset是取决于FastJsonHttpMessageConverter中的Charset配置。
事实上,无论我怎么设置FastJsonHttpMessageConverter
的Charset
,事情也无法得到解决,因此只好重写JSONPResponseBodyAdvice
,因为通过HttpServletResponse
指定ContentType
是有效的!并且正好发现beforeBodyWriteInternal
是个空实现的方法,并在返回JSONPObject
之前调用了一次。
实现类:
public class JsonpBodyAdvice extends JSONPResponseBodyAdvice {
@Override
public void beforeBodyWriteInternal(JSONPObject jsonpObject, MediaType contentType, MethodParameter returnType, ServerHttpRequest request, ServerHttpResponse response) {
((ServletServerHttpResponse) response).getServletResponse().setContentType("application/javascript;charset=UTF-8");
}
}
把上述类作为配置JSONP Advice时的类即可:
@Configuration
public class SpringMvcConfig implements WebMvcConfigurer {
@Bean
public JSONPResponseBodyAdvice jsonpResponseBodyAdvice() {
return new JsonpBodyAdvice();
}
}
评论