最新SpringMVC 4,如何时分秒解决问题@ResponseBody时,String类型乱码

中文乱码这个问题很是头痛,解决post请求的乱码问题,我们也许只要设置编码过滤器,解决get请求时的中文乱码问题,我们可以采取 new String(“接收的字符串”.getbyte(&ISO-8859-1&),“utf-8”)解决(这个比较麻烦,对每个待接收数据都要这样转一下,效率太低,不推荐)还可以通过修改tomcat的配置,我们找到tomcat的安装路径下面的conf文件夹,
在conf文件夹里面找到server.xml文件,打开文件,找到相同的代码“
&&&&&& &Connector port=&8080& protocol=&HTTP/1.1&
&&&&&&&&&&&&&& connectionTimeout=&20000&
&&&&&&&&&&&&&& redirectPort=&8443&& URIEncoding=&UTF-8& /&”
在里面加入“URIEncoding=&UTF-8& 就可以解决get请求方式的乱码;今晚进行项目开发的时候,又遇到一种乱码,就是我使用ajax异步请求数据,使用springmvc 的@ResponseBody 方式返回json数据,出现中文乱码,找了很多解决方法,都不行,有点郁闷了,最后还是皇天不负有心人啊,还是解决了,这里就献上解决的方法了。
在spring mvc的配置文件里面加入如下一段代码就Ok!
&!-- 用于使用@ResponseBody后返回中文避免乱码 --&
&& &&& &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/charset=UTF-8&/value&
&& &&& &&& &&& &&& &&& &&/list&
&& &&& &&& &&& &&& &&/property&
&& &&& &&& &&& &&/bean&
&& &&& &&& &&/list&
&& &&& &&/property&
&& &&/bean&
本文已收录于以下专栏:
相关文章推荐
前言: 最近在写一个Java Web后台时采用了spring+MyBatis+MySQL的方式.记录下遇到的关键问题
接口返回数据相关
使用@ResponseBody后返回NUll...
1:表单提交controller获得中文参数后乱码解决方案
jsp页面编码设置为UTF-8
form表单提交方式为必须为post,get方式下面spring编码过滤器不起效果
人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..
重要的是定位问题的方法和解决问题的耐心!
场景一:SpringMVC+JSON+@ResponseBody
先上截图:
接下来,我们看一下Controller里面的代码:
@RequestM...
SpringMVC的@ResponseBody注解可以将请求方法返回的对象直接转换成JSON对象,但是当返回值是String的时候,中文会乱码,原因是因为其中字符串转换和对象转换用的是两个转换器,而S...
在SpringMVC后台控制层获取参数的方式主要有两种,一种是request.getParameter(&name&),另外一种是用注解@RequestParam直接获取。可以通过required=f...
SpringMVC学习系列-后记 解决GET请求时中文乱码的问题
之前项目中的web.xml中的编码设置:
filter-name&CharacterEnc...
       活动规则:试读样章,评论区留言说一下你对本书的一些感想,同时关注异步社区博客,并留言你想要得到的图书。
       活动时间:即日起-9月14日(活动奖项公告在9月15日日)...
自从Tomcat5.x开始,就对GET方式和POST方式的提交分别给予不同的处理方式。POST方式是利用request.setCharacterEncoding()来进行设置编码,如果没有设置的话,就...
原文:http://blog.csdn.net/u/article/details/?utm_source=tuicool
SpringMVC的@R...
接上一篇文章讲述处理@RequestMapping的方法参数绑定之后,详细介绍下@RequestBody、@ResponseBody的具体用法和使用时机;
他的最新文章
讲师: 许鹏
讲师:董付国
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
按照网上的提示,已经加上了produces="application/charset=utf-8"这样的内容了,如下图所示但是仍然在浏览器上访问这个网址中文仍然是乱码???后来进入debug模式查询,发现response的charset还是ISO-8859:
请问这是为什么呢,然后直接在controller里强行将response的contentType设为utf-8编码也不行。请教一下大牛怎么解决啊、很紧急了。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
xml文件中加上这个就可以了&mvc:annotation-driven&
&mvc:message-converters register-defaults="true"&
&bean class="org.springframework.http.converter.StringHttpMessageConverter"&
&property name="supportedMediaTypes" value="text/charset=UTF-8"&&/property&
&/mvc:message-converters&
&/mvc:annotation-driven&
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
不知道MediaType是啥,不过我一直是用produces = "application/charset=UTF-8"这个编码,还是说前台的编码不是utf-8
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
如果服务器是 Tomcat,则换到 8.0 以上版本。旧版本缺省情况下不是 UTF-8 编码。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
配置一个 spring 的编码过滤器如果是新项目去看看 spring boot 吧,基本不用怎么配置,像中文乱码这些都默认配好了。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
说一下乱码问题
GET和POSTPOST在web.xml文件中配置spring过滤器,使用servlet原始方法 但是这样JSON问题还是解决不了 如图可以解决
GET乱码tomcat7及以下在web.xml中配置URIencoding=utf-8 或者拿过来使用ISO-8859-1手动解码然后再用UTF-8编码
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
配置一个简单的CharacterFilter可能解决不了, 如果使用的是Jackson2,试试下面这种方案
&mvc:annotation-driven&
&mvc:message-converters&
&bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"&
&property name="supportedMediaTypes"&
&util:list&
&value&application/charset=UTF-8&/value&
&value&text/charset=UTF-8&/value&
&/util:list&
&/property&
&/mvc:message-converters&
&/mvc:annotation-driven&
jackson1同理,只是类换成了MappingJacksonHttpMessageConverter
同步到新浪微博
分享到微博?
Hi,欢迎来到 SegmentFault 技术社区!⊙▽⊙ 在这里,你可以提出编程相关的疑惑,关注感兴趣的问题,对认可的回答投赞同票;大家会帮你解决编程的问题,和你探讨技术更新,为你的回答投上赞同票。
明天提醒我
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:博客分类:
今番又遇到乱码问题,有时候真觉得英语母语的那些地区确实挺省事的,至少不用为了这个经典麻烦去折腾。
网络上讨论乱码问题的文章很多,因为各作者使用的计算机环境的不同,往往不是很全面。
这里非常推荐的一篇文章:
简而言之,乱码的“根本原因是由于编码和解码采用的不是同一种码”。例如作者所举的例子,使用GBK编码为UTF-8,使用ISO-8859从UTF-8解码,可能会导致乱码问题。这就好比有一篇中文文章想给王五看,不过这篇文章先由张三翻译成为了英文,然后再由李四翻译成俄文(而不是翻译回中文),但是王五只看得懂中文,于是就麻瓜了。
我们需要保持编码或者解码两头,所使用的字符集转换方向需要正好相反:使用 GBK --& UTF-8 与 UTF-8 --& GBK。由于Java采用了UTF-8编码,所以编码解码均以UTF-8为中介。
对于翻译而言,就是先相当于: 先 中译英,对应的解码,反过来就是 英译中。
遇到乱码问题,通常的检查项包括:
1. 编辑器保存文件的字符集;
2. 数据库的字符集;
3. 应用服务器或者Web服务器处理字符串采用的字符集
4. JSP对于字符集声明
5. Servlet过滤器,以及MVC框架拦截器对于字符集的处理
6. 其它涉及字符集处理的环节
检查各个环节,统一按UTF-8设置。推断我这次碰到的问题属于上述第6中情况。
因为是通过SpringMVC提供的注解@ResponseBody来返回一个JSON字符串,然后在客户端上解析JSON(现如今以JSON作为数据交换格式貌似越来越时髦了,客户端我用的比较多的是jqGrid或者ExtJS)。
Controller代码如下:
@Controller
@RequestMapping("/*")
public class HelloController {
private transient final Log log = LogFactory.getLog(HelloController.class);
@Autowired
private UserManager mgr =
@RequestMapping(value="hello_list.do", method = RequestMethod.POST)
@ResponseBody
public String helloList() {
StringBuilder str = new StringBuilder("{totalProperty:100,root:[");
List&User& users = mgr.getUsers();
for (User user : users) {
str.append("{id: ").append(user.getId());
str.append(", name:'").append(user.getLastName());
str.append("', descn:'").append(user.getFullName()).append("'},");
str.append("{id:4, name:'??', descn:'Китай'},");
str.append("{id:5, name:'tchen8', descn:'中文'}]}");
(str.toString());
return str.toString();
在Spring配置文件里,默认如下:
&!-- Enables the Spring MVC @Controller programming model --&
&mvc:annotation-driven /&
调试程序,控制台输出日志看到是中文,但是在firebug中看到的服务器端送过来的字符串是???? (如果是 "口口口"这样的输出,需要先排除是否为系统的字体缺失),于是判断是服务器最后往端口写字符串流的时侯字符集不对。
通过调试跟踪Spring的源码,声明@ResponseBody时,Spring会通过AnnotationMethodHandlerAdapter去寻找对应的HttpMessageConverter, 我们这里声明返回的类型是String,于是对应StringHttpMessageConverter。通过实验,猜测这个StringHttpMessageConverter也就是&mvc:annotation-driven /&触发的默认的字符串转换工作类。
比较不幸的是,StringHttpMessageConverter所使用的默认字符集是ISO-8859-1
public class StringHttpMessageConverter extends AbstractHttpMessageConverter&String& {
public static final Charset DEFAULT_CHARSET = Charset.forName("ISO-8859-1");
这里不得不提的是与StringHttpMessageConverter 同级的类MappingJacksonHttpMessageConverter,天知道是什么原因:同一个作者,对于这两个类,默认字符集一个是ISO-8859-1,一个是UTF-8。
既然事已如此,那就想办法把这个地方用到的ISO-8859-1也改成UTF-8了。有两个思路:
1. 替换默认字符集;
2. 替换StringHttpMessageConverter
搜索了一下,先看到这个解决办法:
这里提供的是使用一个所谓的ConfigurableStringHttpMessageConverter来替代StringHttpMessageConverter,基本的思路技术是:由于StringHttpMessageConverter中的默认字符集变量声明为final,无法直接通过继承去覆盖,那就把StringHttpMessageConverter照抄一遍,构造函数中新增一个代表字符集的输入参数,然后在配置文件里面通过构造方法注入UTF-8。在配置文件中,将这个Bean声明在&mvc:annotation-driven /&前面,从而能够先于StringHttpMessageConverter被Spring识别和注入。
但是这个方法多少有些蛮干的味道,基于它简化的一个版本可以如下,即通过继承StringHttpMessageConverter,然后在子类中注入我们想要的字符集配置:
public class MyStringHttpMessageConverter extends StringHttpMessageConverter {
public MyStringHttpMessageConverter(Charset defaultCharset) {
List&MediaType& mediaTypeList = new ArrayList&MediaType&();
mediaTypeList.add(new MediaType("text", "plain", defaultCharset));
mediaTypeList.add(MediaType.ALL);
super.setSupportedMediaTypes(mediaTypeList);
Bean的配置依然类似:
&beans:bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"&
&beans:property name="messageConverters"&
&util:list&
&beans:bean id="stringHttpMessageConverter" class="org.mon.ConfigurableStringHttpMessageConverter"&
&beans:constructor-arg value="UTF-8" /&
&/beans:bean&
&/util:list&
&/beans:property&
&/beans:bean&
&!-- Enables the Spring MVC @Controller programming model --&
&mvc:annotation-driven /&
上面的办法是以属性注入的方式,替换了默认的字符集,但为此也需要把converter替换。
另外一个比较简洁的办法,则不需要自己写converter类,而是直接通过属性注入,修改StringHttpMessageConverter的默认配置。
&beans:bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"&
&beans:property name="messageConverters"&
&util:list&
&beans:bean class="org.springframework.http.converter.StringHttpMessageConverter"&
&beans:property name="supportedMediaTypes"&
&util:list&
&beans:value&text/charset=UTF-8&/beans:value&
&/util:list&
&/beans:property&
&/beans:bean&
&/util:list&
&/beans:property&
&/beans:bean&
上面的这个办法,实际上通过setSupportedMediaTypes方法,其实也就是StringHttpMessageConverter在类注释中所提到的办法:
如果再多看一下StringHttpMessageConverter的源码,可以到它的父类中AbstractHttpMessageConverter有这么个方法:
* Returns the default content type for the given type. Called when {@link #write}
* is invoked without a specified content type parameter.
* &p&By default, this returns the first element of the
* {@link #setSupportedMediaTypes(List) supportedMediaTypes} property, if any.
* Can be overridden in subclasses.
* @param t the type to return the content type for
* @return the content type, or &code&null&/code& if not known
protected MediaType getDefaultContentType(T t) {
List&MediaType& mediaTypes = getSupportedMediaTypes();
return (!mediaTypes.isEmpty() ? mediaTypes.get(0) : null);
注释中写的明白:"Can be overridden in subclasses." 那就不必客气了。于是我们大概也能有如下的做法:
public class MyStringHttpMessageConverter2 extends StringHttpMessageConverter {
private static final MediaType utf8 = new MediaType("text", "plain", Charset.forName("UTF-8"));
protected MediaType getDefaultContentType(String dumy) {
return utf8;
对应的配置:
&beans:bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"&
&beans:property name="messageConverters"&
&util:list&
&beans:bean id="myStringHttpMessageConverter2" class="org.mon.MyStringHttpMessageConverter2" /&
&/util:list&
&/beans:property&
&/beans:bean&
&!-- Enables the Spring MVC @Controller programming model --&
&mvc:annotation-driven /&
以上的几个方法,都能解决@ResponseBody导致的乱码问题,虽然StringHttpMessageConverter将来确实有可能把默认字符集修改成UTF-8,从而导致上述功夫最后变成白忙活。但也确实感谢有这么个小阻碍,迫使自己去分析问题寻找答案。收获不在于结果,而在过程吧
最后show一把我的页面:
浏览 29117
浏览: 107350 次
来自: 杭州
很好啊,最喜欢用的还是复制行和删除行。
哦,好的,谢谢
果然是这样的
同样的问题,但是你所上说的几个方法都没能解决我的问题呢!在springmvc配置文件中添加以下代码(版本号:4.0.2)
&context:component-scan base-package=&com.ongaint.controller&/&
&mvc:annotation-driven&
&mvc:message-converters register-defaults=&true&&
&bean class=&org.springframework.http.converter.StringHttpMessageConverter&&
&constructor-arg value=&UTF-8&/&
&property name=&writeAcceptCharset& value=&false&/&
&/mvc:message-converters&
&/mvc:annotation-driven&
注: & writeAcceptCharset:控制响应头,设置为false,避免响应头过大。
本文已收录于以下专栏:
相关文章推荐
百度能搜到N多答案,但很真能解决问题的没多少。
这代码虽然不是我原创的。但我还是想把该文章选成原创,就是想让更多的有遇到相同问题的人,快点拜托这乱码问题。
代码很简单
@RequestM...
终极大法:
1、web.xml增加utf8编码器:
encodingFilter
org.springframework.web.filter.CharacterEncodingFilter...
人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..
过滤器我就不说了。
如果你是要返回一个String的话,比较蛋疼,因为很少直接返回String,所以我最近才发现这个问题,在你的Spring mvc的Controller上加上:@RequestMa...
中文乱码这个问题很是头痛,各种解决中文乱码的方法
SpringMVC使用注解@ResponseBody返回json以及中文乱码问题解决
 在这里我不得支持一下SpringMVC是一个不错的框架,用了springmvc这么长时间 ,我犯了个错误...
转自:http://blog.csdn.net/xiaoxin888888/article/details/8279745
转自:/blog/1...
Spring3.0 MVC @ResponseBody 的作用是把返回值直接写到HTTP response body里。
Spring使用AnnotationMethodHandle...
Spring3.0 MVC @ResponseBody 的作用是把返回值直接写到HTTP response body里。 
Spring使用AnnotationMethodHandlerAda...
Spring3.0 MVC @ResponseBody 的作用是把返回值直接写到HTTP response body里。 
Spring使用AnnotationMethodHandle...
原文:http://blog.csdn.net/u/article/details/?utm_source=tuicool
SpringMVC的@R...
他的最新文章
讲师: 许鹏
讲师:董付国
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)

我要回帖

更多关于 微信48小时限制 解决 的文章

 

随机推荐