文档章节

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

五大三粗
 五大三粗
发布于 2015/10/06 09:23
字数 730
阅读 5509
收藏 18

由于现在的项目一般都追求前后端分离,依靠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>

© 著作权归作者所有

共有 人打赏支持
五大三粗
粉丝 162
博文 2264
码字总数 4712446
作品 0
广州
程序员
私信 提问
加载中

评论(3)

安浪天
没仔细看,俩种写法都可以。sorry
安浪天
@RequestMapping(value = "/add", produces = {"application/json;charset=UTF-8"})写错了
@RequestMapping(value = "/add", produces = "application/json;charset=UTF-8")
乱笔·青玉
乱笔·青玉
在 web.xml 里加上
<!-- UTF-8编码配置 -->
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>


也可以的
Spring MVC3返回JSON数据中文乱码问题解决

Spring MVC3返回JSON数据中文乱码问题解决 查了下网上的一些资料,感觉比较复杂,这里,我这几使用两种很简单的办法解决了中文乱码问题。 Spring版本:3.2.2.RELEASE Jackson JSON版本:2.1...

双月通天
2015/10/14
209
0
各种乱码解决

1.请求URL带中文 URL:http://localhost:8080/demo-web/file/download.do?file=季度.txt 解决方法: 在tomcat/conf/server.xml中加入URIEncoding配置...

warlockssss
2016/09/23
27
0
SpringMVC 返回中文字符串时乱码

SpringMVC的@ResponseBody注解可以将请求方法返回的对象直接转换成JSON对象,但是当返回值是String的时候,中文会乱码,原因是因为其中字符串转换和对象转换用的是两个转换器,而String的转换...

费氏家族
2017/10/30
0
0
解决spring-mvc @responseBody注解返回json 乱码问题

在使用spring-mvc的mvc的时候既享受它带来的便捷,又头痛它的一些问题,比如经典的中文乱码问题。现在是用json作为客户端和服务端 的数据交换格式貌似很流行,但是在springmvc中有时候会因为...

刘志成
2013/11/15
0
9
解决SpringMVC的@ResponseBody返回中文乱码

SpringMVC的@ResponseBody返回中文乱码的原因是SpringMVC默认处理的字符集是ISO-8859-1,在Spring的org.springframework.http.converter.StringHttpMessageConverter类中可以看到如下代码: ...

爱笑的痴迷者
2016/09/21
29
0

没有更多内容

加载失败,请刷新页面

加载更多

RabbitMQ入门

RabbitMQ是一个由erlang开发的基于AMQP(Advanced Message Queue)协议的开源实现。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面都非常的优秀。是当前最主流的消息中间...

watermelon11
今天
14
0
今天的学习

自动加载:方法一 function __autoload( $className ){在这里,完成加载B这个类文件的工作。}class A{} //这是一个类$a1 = new A(); //这里没有自动加载的发生,因为A这个类...

墨冥
今天
2
0
印刷工艺步骤

印刷厂从收到订单到交付整个流程,一般涉及到以下步骤 1.设计(经过软件如cdr,psd,ai等等设计需要印刷的名片,宣传单,画册等物料); 2.排版拼版(在电脑软件这区域完成); 3.出版、出硫...

focusone
昨天
2
0
virtualbox中安装ubuntu

virtualbox+ubuntu 安装virtualbox,当前版本是6.0.4 下载ubuntu安装盘,建议lubuntu,链接是http://mirrors.ustc.edu.cn/ubuntu-cdimage/lubuntu/releases/18.04.2/release/lubuntu-18.04.......

chuqq
昨天
5
0
exists 谓词的子查询

https://blog.csdn.net/qq_19782019/article/details/78730882

仟昭
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部