Ajax响应中文乱码 [SpringMVC使用@ResponseBody处理Ajax请求]

告别时钟树平衡噩梦:在Innovus中巧妙设置stop/ignore pin来优化分段时钟网络 本文深入探讨了在Innovus工具中利用stop/ignore pin优化分段时钟树网络的高阶技巧。针对数字IC后端设计中的时钟树平衡难题,详细解析了特殊引脚属性的战略应用场景和配置方法,帮助工程师有效解决SoC设计中复杂的时钟结构问题,显著提升时序收敛效率。 阅读详情

Spring3.0 MVC @ResponseBody 的作用是把返回值直接写到HTTP response body里。 

 

Spring使用AnnotationMethodHandlerAdapter的handleResponseBody方 法, AnnotationMethodHandlerAdapter使用request header中"Accept"的值和messageConverter支持的MediaType进行匹配,然后会用"Accept"的第一个值写入 response的"Content-Type"。
一般的请求都是通过浏览器进行的,request header中"Accept"的值由浏览器生成。
  

有人跟踪@ResponseBody 的实现类发现其默认的编码是 iso-8859-1,

解决办法,在spring mvc的配置文件中手工配置bean:
<!-- 启动Spring MVC的注解功能,完成请求和注解POJO的映射 -->    
<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>  

 

这样通过配置AnnotationMethodHandlerAdapter类messageConverters属性来指定编码。
记住,需要把bean部分加入到<context:component-scan base-package="com.zlscw.mvc" />前面,

这样就可以在jquery中直接调用而不出现乱码了。

 

-------------------------------------------这篇文章说的很到位

近日用Spring3的MVC写东西,深感其之于Webwork/Struts2的便利,但是在通过@ResponseBody这个 annotation输出一个json字符串的时候,发现页面上获得的json字符串中文字符出现了乱码的现象。通过firefox观察返回的字符串,中 文部分全部变成了???????的形式,初步判定是返回时,spring处理@ResponseBody使用了错误的编码。

因为我在web.xml中已经配置了Spring的CharacterEncodingFilter,并且强制将request和response的编码都指定为utf-8,所以出现乱码的原因肯定是在Spring内部某处的逻辑了。

把log4j中关于spring的输出级别调为debug,通过访问出问题的地址,发现Spring在处理@ResponseBody这个 annotation的时 候,org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter 使用了org.springframework.http.converter.StringHttpMessageConverter进行处理,于是打 开了Spring的源码,看看这个类究竟做了哪些事情。

不看不要紧,一看吓一跳,里面竟然是这样定义其默认编码的: 

1 publicstaticfinalCharset DEFAULT_CHARSET = Charset.forName("ISO-8859-1");

顿时心生N种不爽:堂堂Spring,竟然还在其中用西欧字符集作为其默认编码,坑爹啊!(很多spring的类中,涉及编码的已经都是utf-8 了,比如负责JSON视图的MappingJacksonHttpMessageConverter,就是默认使用UTF-8)。本来想直接修改 spring的源码重新打包一个jar出来,后来看spring的java doc发现,其父类org.springframework.http.converter.AbstractHttpMessageConverter 中的getDefaultContentType方法是可以重写的:

By default, this returns the first element of the supportedMediaTypes property, if any. Can be overridden in subclasses.

心想这下就简单了,你的DEFAULT_CHARSET不是final么?那我自己继承一个出来,按照我的需求定义为utf-8不就得了?代码如下:

01 publicclassUTF8StringHttpMessageConverter extendsStringHttpMessageConverter {
02   
03  privatestaticfinalMediaType utf8 = newMediaType("text", "plain",
04  Charset.forName("UTF-8"));
05  privatebooleanwriteAcceptCharset = true;
06   
07  @Override
08  protectedMediaType getDefaultContentType(String dumy) {
09  returnutf8;
10  }
11   
12  protectedList<Charset> getAcceptedCharsets() {
13  returnArrays.asList(utf8.getCharSet());
14  }
15   
16  protectedvoidwriteInternal(String s, HttpOutputMessage outputMessage)
17  throwsIOException {
18  if(this.writeAcceptCharset) {
19  outputMessage.getHeaders().setAcceptCharset(getAcceptedCharsets());
20  }
21  Charset charset = utf8.getCharSet();
22  FileCopyUtils.copy(s, newOutputStreamWriter(outputMessage.getBody(),
23  charset));
24  }
25   
26  publicbooleanisWriteAcceptCharset() {
27  returnwriteAcceptCharset;
28  }
29   
30  publicvoidsetWriteAcceptCharset(booleanwriteAcceptCharset) {
31  this.writeAcceptCharset = writeAcceptCharset;
32  }
33   
34 }

然后,在spring的配置文件中添加如下bean声明,用自己写的类替换掉原有的StringHttpMessageConverter:

1 <beanclass="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
2     <propertyname="messageConverters">
3         <list>
4             <beanid="utf8StringHttpMessageConverter"class="xxx.xxx.UTF8StringHttpMessageConverter"/>
5         </list>
6     </property>
7 </bean>

再看通过@ResponseBody返回的json字符串,终于中文都可以正常显示了。

 

-------------------------------------------下面有一些解释

但我们一般会在标注@ResponseBody的方法上返回String或byte[]类型的结果,期望的"Content-Type"的值应为"text/plain"或"application/octet-stream"。
这样导致了浏览器不能正确处理返回的内容。
实际上Spring在用HttpMessageConverter处理的过程中首先会判断response header中有没有写入"Content-Type",如果没有写入的话才会使用request header中"Accept"的第一个值。
但是由于Spring对HttpServletResponse进行了封装,实际上使用的是ServletServerHttpResponse,这个类有一个对真正的HttpServletResponse的引用。
判断response header的过程中使用的是ServletServerHttpResponse的getHeaders()方法,但该方法并没有返回真正的HttpServletResponse中的header。(这应该有问题吧?)
所以我们虽然可以在Controller的方法中加入对HttpServletResponse的引用,然后设置"Content-Type"的值,但是并不会起作用。
来处理@ResponseBody,该类再使用一些HttpMessageConverter来具体处理信息。
Chrome生成的值为application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,**
所以最后写入response中"Content-Type"的值为"application/xml"或"application/x-ms-application"。

 

 -------------------------------------------------其实这个注解完全可以不用, 直接使用response往输出流里面写。

 使用jQuery ajax调用的返回json,中文乱码问题

Jquery :

$.ajax({
    url: '/test/testAction.do?method=test',
    type: 'POST',
    dataType: 'json',
    timeout: 5000,
    async: false,
    error: function(){
     alert('获取数据失败!');
    },
    success: function(json){
     jsObject  = eval_r(json);
    }
  });
  return jsObject;

 

JSONArray json = JSONArray.fromObject(SysList);//SysList是一个List
//  设置response的ContentType解决中文乱码
  response.setContentType("text/html;charset=UTF-8");
  response.getWriter().print(json.toString());
  return null;

【100%通过率】华为od机试C卷【贪吃的猴子】Java&Go 实现 一只贪吃的猴子,来到一个果园,发现许多串香蕉排成一行,每串香蕉上有若干根香蕉。每串香蕉的根数由数组numbers给出。猴子获取香蕉,每次都只能从行的开头或者未尾获取,并且只能获取N次,求猴子最多能获取多少根香蕉。第一次获取香蕉为行的开头,第二次获取为行的末尾,因此最终根数为4+3 =7。全部获取所有的香蕉,因此最终根数为1+2+3 = 6。第二行为数组numbers的值每个数字通过空格分开。1:简单题目,两个指针分别指向头尾,逐个对比即可。第一行为数组numbers的长度。第三行输入为N,表示获取的次数。 阅读详情

相关推荐

Mac用户看过来!M1/M2芯片安装CiteSpace完整指南(从Homebrew到成功运行)

本文为Mac M1/M2芯片用户提供CiteSpace安装的完整指南,从Homebrew安装适配的Java环境到最终成功运行CiteSpace。详细步骤包括环境检查、Java配置、CiteSpace下载与优化,解决常见问题如内存分配、图形渲染和中文显示乱码,确保科研人员能顺利使用这一文献可视化工具。

weixin_42530458的博客 308

SpringMVC用ajax到前台乱码解决办法

在用SpringMVC做项目时想实现一个无刷新分页,所以需要通过ajax向后台提交数据然后后台在返回一个字符串,但是却发现返回来的中文全是乱码,后面经过多方面的查询得知解决办法 只需要在@RequestMapping后面加入如下代码就可以解决@RequestMapping( value="/******",produces={"text/html;charset=UTF-8;","applicat

JenKin的博客 1189

【头歌educoder】离散数学实训参考-第二章-关系-part1-关系基础

python实现离散数学-关系基础-二元关系

wander_alice的博客 8465

SSM框架——SpringMVC中使用@ResponseBody注解返回值,Ajax取得中文乱码解决方法

Spring使用AnnotationMethodHandlerAdapter的handleResponseBody方法, AnnotationMethodHandlerAdapter使用request header中&quot;Accept&quot;的值和messageConverter支持的MediaType进行匹配,然后会用&quot;Accept&quot;的第一个值写入 response的&quot;Content-Type&quot;。一般的请..

weixin_44387814的博客 339

python批量生成CAD图纸

python批量生成CAD图纸

轩逸云的博客 1万+

从零解析特斯拉线圈:谐振变压器的核心原理与DIY实践

本文深入解析特斯拉线圈的工作原理与DIY实践,从LC振荡电路到电磁耦合,详细介绍了谐振变压器的核心原理。通过材料清单、绕制技巧和安全指南,帮助爱好者从零开始打造迷你闪电发生器,体验高压电子实验的独特魅力。

weixin_33670786的博客 493

spring中@ResponseBody ajax返回处理信息给前台 中文乱码问题

解决办法:  @RequestMapping(value="/gpoChoRequestDetail/importGpoCatalog",method=RequestMethod.POST,produces="text/html;charset=UTF-8")

亿卢向倍的专栏 814

从帧结构到数据解析:深入理解CJ/T 188 MBUS水表通信协议

本文深入解析CJ/T 188 MBUS水表通信协议,从帧结构到数据解析提供完整指南。通过典型报文示例和实战案例,详细讲解地址域、控制码、数据标识符(DI)等关键字段的解析技巧,并分享校验算法与常见错误排查方法,帮助开发者快速掌握MBUS协议在水表通信中的应用。

weixin_28710999的博客 423

springmvc框架,使用ajax 请求数据返回数据中文乱码处理

问题:ajax 发送请求得到的数据中包含中文显示????乱码原因:SpringMVC框架的 @RequestBody 和 @ResponseBody两个注解,分别完成请求对象到对象响应的过程,一步到位,但是因为Spring3.x以后有了HttpMessageConverter消息转换器,把返回String类型的数据编码全部默认转换成iso-8859-1的编码格式,所以就出现了我们遇到的乱码的情况,...

啊大海全是水的博客 3384

本体(Ontology)概述

认识本体        本体(Ontology)的概念源自于哲学领域,在哲学中的定义为“对世界上客观事物的系统描述,即存在论”。哲学中的本体关心的是客观现实的抽象本质。而在计算机领域,本体可以在语义层次上描述知识,可以看成描述某个学科领域知识的一个通用概念模型。德国学者Studer在1998年给出了本体的相关定义“本体是共享概念模型的形式化规范说明”。这个定义包含了四层含义:即共享(share)...

baijinswpu的博客 7万+

Tomcat启动过程中cmd窗口(控制台)中文乱码的问题

tomcat启动时,启动过程日志中文乱码的处理方法。

寻码启示 1944

springmvc ajax中文乱码,Ajax响应中文乱码 [SpringMVC使用@ResponseBody处理Ajax请求]

Spring3.0 MVC @ResponseBody 的做用是把返回值直接写到HTTP response body里。 htmlSpring使用AnnotationMethodHandlerAdapter的handleResponseBody方法,AnnotationMethodHandlerAdapter使用request header中"Accept"的值和messageConverter支...

weixin_28809949的博客 602

从零构建简历智能匹配系统:AI技术助力高效招聘

本文详细介绍了简历智能匹配系统的开发过程,从数据收集、预处理、特征提取到模型匹配和结果展示,每一步都提供了详细的代码实例。通过使用TF-IDF、Word2Vec和BERT等技术,我们能够有效地将求职者的简历与职位描述进行匹配,从而提高招聘效率。未来,随着自然语言处理技术的进一步发展,简历智能匹配系统将变得更加智能和高效,为企业和求职者提供更好的服务。

理论都是虚的,代码才是王道。 309

[转]Ajax响应中文乱码 [SpringMVC使用@ResponseBody处理Ajax请求]

Spring3.0 MVC @ResponseBody 的作用是把返回值直接写到HTTP response body里。     Spring使用AnnotationMethodHandlerAdapter的handleResponseBody方 法, AnnotationMethodHandlerAdapter使用request header中"Accept"的值和message...

翼づ坏坏的天空 199

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

SpringMVC--处理json

springmvc 处理json

射手座的程序媛的专栏 1448

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

远程springmvc ajax请求乱码,springMVC解决ajax请求乱码的三种方法

在使用spring MVC进行开发时会遇到这样那样的问题,也就是说,返回的任何中文数据都是乱码,下面爱站技术频道告诉你springMVC解决ajax请求乱码的三种方法,一起来看看吧!先列出简单的请求代码:浏览器端:$.ajax({type: "POST",url: "/pages/ajax",data: "name=garfield&age=18",success: function(da...

weixin_39609622的博客 261

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

SpringMVC输出中文乱码

首先springmvc处理ajax请求,直接输出数据而不是跳转页面,可以在方法上加@ResponseBody 这时候如果有中文乱码,可以在@RequestMapping中加produces = "text/html;charset=UTF-8" 如果还不行,可以在方法里response.setContentType("text/html;charset=UTF-8");

keketrtr的专栏 520

SpringMVC的学习笔记(整合)

SpringMVC初学经历笔记

weixin_52938172的博客 2228
上一篇: Spring MVC的@ResponseBody返回JSON串
下一篇: springMVC jqPlot ajax数据交互
lb8607
博客等级 码龄18年 17粉丝 18原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值