最近在工作中,又遇到了以前出现的一个编码问题。在使用前端Ajax向SpringMVC请求JSON数据,用来获得ztree的数据。返回的数据中有中文,当树渲染出来时,发现树的各个节点上全是"???"这样的。脑海中第一反应,数据乱码了。那么在地方乱的呢?前端和后端都是UTF-8的编码格式,会是什么地方出了问题呢?经过跟踪代码,发现SpringMVC在return之前获取的数据都是正常的中文,到Ajax请求得到的数据就乱了。也就是说,数据在Spring 返回向前端的时候乱码了。
以前在遇到过这个问题,今天又遇到了,这只能怪自己编码不够严谨。所以就将该问题的解决方案贴出来,给自己做个备忘,空的时候在回头看看以作警示。
目前解决返回JSON乱码,我总共收集了两种方法来解决它:
1、最简单,最快捷,也是最暴力的一种
在方法的注解中加入 produces 属性

@RequestMapping(value = "/del", produces = {"application/json;charset=UTF-8"})

表示将功能处理方法将生产json格式的数据,此时根据请求头中的Accept进行匹配,如请求头“Accept:application/json”时即可匹配。

这种方法比较快捷、简单。但是如果用到的地方多,岂不是每个方法都要这么配置?所以需要更加好的解决方案,也就是我要说第二种方案

2、配置消息转换器的方式(建议采用这种方式来解决)

<!-- 设置对字符串的消息转换器 -->
<bean id="stringHttpMessageConverter"
	class="org.springframework.http.converter.StringHttpMessageConverter">
	<property name="supportedMediaTypes">
	    <list>
		<value>text/plain;charset=UTF-8</value>
		<value>application/json;charset=UTF-8</value>
	    </list>
	</property>
</bean>
<!-- 避免IE执行AJAX时,返回JSON出现下载文件 -->
<!-- Jackson 是Spring 自带的功能 -->
<bean id="mappingJackson2HttpMessageConverter"
	class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
	<property name="supportedMediaTypes">
		<list>
			<value>application/json;charset=UTF-8</value>
			<value>application/xml;charset=UTF-8</value>
			<value>text/html;charset=UTF-8</value>
			<value>text/plain;charset=UTF-8</value>
			<value>text/xml;charset=UTF-8</value>
			<value>text/javascript;charset=UTF-8</value>
		</list>
	</property>
</bean>

<mvc:annotation-driven>
	<mvc:message-converters>
		<ref bean="stringHttpMessageConverter" />
		<ref bean="mappingJackson2HttpMessageConverter" />
	</mvc:message-converters>
</mvc:annotation-driven>

SpringMVC 是按照message-converters 里面配置的处理数据格式的,配置了2个消息转换器 Jackson 和 字符串 ,这2个消息转换器都是Spring自带的,个人感觉很方便。

标签: 关于SpringMVC返回字符串(JSON)乱码问题, SpringMVC返回字符串乱码, SpringMVC返回JSON乱码, SpringMVC返回乱码

添加新评论