解决FastJson之JSONP中文乱码
ShiJh Lv3

当SpringMvc使用fastjson的@ResponseJSONP返回jsonp给前端时,中文会出现乱码。

JSONP中文乱码解决方法

问题描述

在SpringMvc中使用fastjson提供的@ResponseJSONP注解返回JSONP数据时,会出现中文乱码问题,根本原因在于实际返回类型为application/javascript且没有指定charset=utf-8,即使设置@RequstMappingproducer属性为application/javascript;charset=utf-8也无法得到解决。关于此问题,Github上存在一个两年前的issue#1689,至今仍然OPEN,开发者仍不解决这个问题!

解决方法

在issue中开发者提到:

neil4dong commented on 12 Jul 2019

@kakakeven 最终响应的Charset不取决于JSONPResponseBodyAdvice 的操作, JSONPResponseBodyAdvice 仅仅只是将返回结果做了封装, 实际响应Charset是取决于FastJsonHttpMessageConverter中的Charset配置。

事实上,无论我怎么设置FastJsonHttpMessageConverterCharset,事情也无法得到解决,因此只好重写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();
    }
}
 评论