解决springMVC4下使用@ResponseBody的中文乱码问题

由于现在的项目一般都追求前后端分离,依靠Ajax进行通信,这样有助于团队分工、项目维护和后期的平台移植,这就使得后端框架对视图层的功能要求越来越低~

今天要说的是基于SpringMVC开发web后端时,为了简单而直接在控制器方法中返回json字符串时碰到的中文乱码问题。算是非常基础的问题,大牛请绕道~

其实我自己一开始也没觉得能有多复杂,认为一搜索就能找到一大把解决方案,所以没有计划耗费多久时间,更没打算转成写一篇博文记录过程。可不曾想到,足足花了我2个半小时,今天看来又要加班了!其实确实在GG和百度中搜索到了大量的相关解决方案,晒晒捡捡也发现至少有不下七八种解决方案。可悲剧的是统统在我测试下无效。

对于JAVAEE,我真真儿的是新手,项目也没有给我太多时间来深究源码,只能快速的试错,总算把几个方案拼凑出来一个能用的了!下面我就简单的说一下我的解决方法吧。

首先,我们要知道,为毛@ResponseBody不支持中文:传送门,这是我找到的写的最细的一篇文章了,尽管它并没有解决我的问题。

知道了原因,再来选择解决方案,一开始满心欢喜的找到一个最简单的方案:

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

可是不管用撒,原因不明~~

好吧,那再试一个:

response.setContentType("text/plain;charset=UTF-8");

也不行哇,这个其实只是设置了响应头中的字符集,但是@ResponseBody最终还是会把字符以“ISO-8859-1”的方式输出,可恶!

简单的方法木牛了,只能选择手动设置字符转换类了:

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" >
    <property name="messageConverters">
        <list>
            <bean class = "org.springframework.http.converter.StringHttpMessageConverter">
                <property name = "supportedMediaTypes">
                    <list>
                        <value>text/html;charset=UTF-8</value>
                    </list>
                </property>
            </bean>
        </list>
   </property>
</bean>

注意,需要把这段放在xxx-servlet.xml中<context:component-scan base-package="xxxxx"/>前面哦~

其实这样已经可以解决了,不过不完美,留一下这个时候的响应头,你会发现体积非常大(Accept-Charset会达到4K+),这是因为默认情况下StringHttpMessageConverter.writeInternal()会将所有可用字符集回写到响应头中,这会消耗非常大的带宽!浪费可耻!

一筹莫展了吧~幸好发现StringHttpMessageConverter提供的参数:writeAcceptCharset,所以最终的写法如下:

<!-- 用于使用@ResponseBody后返回中文避免乱码 --> <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" > <property name="messageConverters"> <list> <bean id="stringHttpMessageConverter" class="org.springframework.http.converter.StringHttpMessageConverter"> <property name="writeAcceptCharset" value="false" /><!-- 用于避免响应头过大 --> <property name="supportedMediaTypes"> <list> <value>text/html;charset=UTF-8</value> </list> </property> </bean> </list> </property> </bean>
时间: 2024-08-05 19:31:37

解决springMVC4下使用@ResponseBody的中文乱码问题的相关文章

SpringMVC4.0.3 @ResponseBody JSON 中文乱码问题

百度能搜到N多答案,但很真能解决问题的没多少. 这代码虽然不是我原创的.但我还是想把该文章选成原创,就是想让更多的有遇到相同问题的人,快点拜托这乱码问题. 代码很简单 @RequestMapping(value="listUserJson.html",produces="text/html;charset=UTF-8") @ResponseBody public String listUserJson(int page,int rows){ TreeMap<S

win7下zend studio5.5中文乱码解决方法

win7下zend studio5.5中文乱码解决方法 1.打开 C:Documents and SettingsAdministratorZDEconfig_5.5desktop_options.xml(这个地址要根据自己的电脑而定.) 2.查找 editing.encoding 3.修改里面为 <encoding name=”UTF-8″/> 4.保存,并将该文件属性设置为只读,否则zend每次启动都会将 desktop_options.xml 初始化 5.重启 zend 注意,你现在打开

解决SpringMVC的@ResponseBody返回中文乱码

SpringMVC的@ResponseBody返回中文乱码的原因是SpringMVC默认处理的字符集是ISO-8859-1,在Spring的org.springframework.http.converter.StringHttpMessageConverter类中可以看到如下代码: public static final Charset DEFAULT_CHARSET = Charset.forName("ISO-8859-1"); 解决返回中文乱码的问题有两种,第一种是局部的,只针

Xshell下VI打开文件中文乱码解决

修改 /etc/sysconfig/i18n 成如下值:LANG="zh_CN.utf8"LANGUAGE="zh_CN.utf8"SUPPORTED="zh_CN.utf8:zh_CN.GB18030:zh_CN:zh:en_US.UTF8:en_US:en"SYSFONT="lat0-sun16" 保存退出后,重新连接,连接编码也选utf-8即可 Xshell下VI打开文件中文乱码解决,布布扣,bubuko.com

JFreechart在linux下不显示及中文乱码问题

一.使用JFreeChart建的报表,在window下能正常显示,但是放到linux下就报错,而且有时候会把tomcat挂掉, 原因是jfreechart的在linux系统中需要访问java awt库提供...... 一.使用JFreeChart建的报表,在window下能正常显示,但是放到linux下就报错,而且有时候会把tomcat挂掉,原因是jfreechart的在linux系统中需要访问java awt库提供的图形功能,而linux下的绝大多数版本的java awt类库都需要x serv

配置Tomcat解决URL传参引出的中文乱码问题

今天在写一个JSP页面时候,发现下面报错: <span style="font-size:18px;"> <a href="request.jsp?username=小七七">测试URL传参</a></span> 通常情况下,通过使用contentType和下面的就可以解决传参过程中的中文乱码问题,但是貌似URL传参还要设备别的东西. <% request.setCharacterEncoding("u

解决Centos 6.3 中 gedit中文乱码问题

1.安装gconf-editor yum list | grep conf-editor yum install gconf-editor 2.运行gconf-editor 设置: apps  ---> gedit-2  --->  preferences  ----> encoding auto-detected 项添加Add New list value: GB2312 shown_in_menu 项添加 New list value: GB2312  解决Centos 6.3 中

[转]解决IIS下UTF-8文件报错乱码的问题

找了两天才找到解决办法…….晕晕晕...用第二种方法解决了. 网上找到的方法都没有写这一条 If objASPError.ASPDescription > "" Then 后面的回车去掉(这个地方微软写错了) 将这一句后面的<br>注释掉即可! Response.Write Server.HTMLEncode(objASPError.ASPDescription)' & "<br>" 转自:http://blog.csdn.ne

如何解决链入js,innerHTML中文乱码问题呢?

描述:发生在做suhuotong网站的时候,添加在线客服代码的时候三个地方1.将js以UTF-8无BOM编码:VS修改或者使用NotePad++修改2.<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />[我觉得这个不是关键的]3.<script type="text/javascript" src="/{aspcms:sitepa