ajax提交 返回中文乱码问题

解决Java中使用Ajax提交返回值中文乱码问题 在客户端,我们需要确保Ajax请求中的数据也使用了正确的字符编码。一种常见的方式是在发送Ajax请求之前,设置请求头的Content-Type属性为"application/x-www-form-urlencoded;通过在服务端和客户端正确设置字符编码,以及在服务器的配置中进行相关配置,可以有效解决Java中使用Ajax提交返回值中文乱码的问题。除了在代码中进行字符编码的设置外,还可以通过配置服务器的字符编码来解决中文乱码问题。上述代码会将响应的字符编码设置为UTF-8,确保返回的中文字符能够正确显示。 阅读详情

 

接口返回数据相关

使用@ResponseBody后返回NUll

说明:刚把后台运行起来,兴高采烈的测试接口数据,结果无论如何都是返回null,
最终通过各种百度,发现原来是没有引入关键的Jar包.
解决办法:  需要引入jackson的jar包(jackson core和jackson mapper),引入后
图:
 
 

使用@RequestMapping返回中文乱码

原因分析:(网上基本都是一致的答案)

首先: 确定的是(经过多次测试的结果)只有当返回值是 String时才会出现中文乱码,而当返回值是Map<String, Object>或者是其它类型时,并没有中文乱码的出现.

 
然后找原因: 原因是这可以说是spring mvc的一个bug,spring MVC有一系列HttpMessageConverter去处理用@ResponseBody注解的返回值,如返回list或其它则使用 MappingJacksonHttpMessageConverter,返回string,则使用 StringHttpMessageConverter,而这个convert使用的是字符集是iso-8859-1,而且是final的。所以在当返回json中有中文时会出现乱码。
[java]  view plain copy 在CODE上查看代码片派生到我的代码片
  1. public static final Charset DEFAULT_CHARSET = Charset.forName("ISO-8859-1");      


解决办法(以及是否尝试成功): 尝试了很多种网上的办法,有一些根本无用,有一些当客户端的Accep是 application/json;时无用.最终也是结合客户端的修改才成功解决问题的。
 
环境:  SpringMvc 3.1
 
客户端分为三种不同的请求:
1.浏览器中直接Get访问,Accept是"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"
2.用Jquery的jsonp ajax请求,Accept是"*/*"
3.用h5+环境下的mui ajax请求,Accept是"application/json;charset=utf-8"
(PS:h5+是最近做的跨平台移动项目的开发环境,另外就是有试过默认的Accept"application/json"的话不管服务器端用哪种方法,在呢么配置,都会返回乱码,所以最后只得手动加上charset=utf-8了)
 
注: 如果什么都不加,第一种和第二种都是返回的乱码,第三种由于手动要求了返回格式,所以没有乱码,这里之所以要第三组做对比是因为有一些方法会造成第三组不能正常访问。
尝试方法一: 在配置文件中的mvc:annotation-driven中添加如下代码
[html]  view plain copy 在CODE上查看代码片派生到我的代码片
  1. <mvc:annotation-driven >  
  2.     <!-- 消息转换器 -->  
  3.     <mvc:message-converters register-defaults="true">  
  4.       <bean class="org.springframework.http.converter.StringHttpMessageConverter">  
  5.         <property name="supportedMediaTypes" value="text/html;charset=UTF-8"/>  
  6.       </bean>  
  7.     </mvc:message-converters>  
  8.   </mvc:annotation-driven>  

原理: StringHttpMessageConverter的父类里有个List<MediaType> supportedMediaTypes属性,用来存放 StringHttpMessageConverter支持需特殊处理的 MediaType 类型,如果需处理的 MediaType 类型不在 supportedMediaTypes列表中,则采用默认字符集。

最终结果:
请求方法1中文乱码
请求方法2返回正确的中文
请求方法3返回正确的中文
尝试方法二: 在配置文件中的mvc:annotation-driven中添加如下代码
[html]  view plain copy 在CODE上查看代码片派生到我的代码片
  1. <mvc:annotation-driven>  
  2.       <mvc:message-converters>  
  3.           <bean class="org.springframework.http.converter.StringHttpMessageConverter">  
  4.               <property name="supportedMediaTypes">  
  5.                   <list>  
  6.                    <span style="white-space:pre">   </span>  <value>text/html;charset=UTF-8</value>  
  7.                       <value>application/json;charset=UTF-8</value>  
  8.                       <value>*/*;charset=UTF-8</value>  
  9.                   </list>  
  10.               </property>  
  11.           </bean>  
  12.       </mvc:message-converters>  
  13.   </mvc:annotation-driven>  

原理: 原理同上,但是这里多加了几个value。

最终结果:
请求方法1中文乱码
请求方法2返回正确的中文
请求方法3返回正确的中文
关于这种类型的方法为什么不能正确解决,原因网上都是各不相同,这里也不敢轻易做出结论.总之,目前来看这种方法不能解决问题
 
尝试方法三: 在@RequestMapping里的配置produces="text/html;charset=UTF-8;"
[java]  view plain copy 在CODE上查看代码片派生到我的代码片
  1. @RequestMapping(value = "***",produces="text/html;charset=UTF-8;")  


原理: 手动给对应的Accept返回制定格式编码数据。

 
最终结果:
请求方法1返回正确的中文
请求方法2返回正确的中文
请求方法3无法请求,出了错,因为produces没有添加application/json;对应的头部.
 
尝试方法四: 在@RequestMapping里的并发配置produces={"application/json;","text/html;charset=UTF-8;"}
[java]  view plain copy 在CODE上查看代码片派生到我的代码片
  1. @RequestMapping(value = "***",produces={"application/json;","text/html;charset=UTF-8;"})  


原理: 手动给对应的Accept返回制定格式编码数据。

 
最终结果:
请求方法1返回中文乱码
请求方法2返回中文乱码
请求方法3返回正确的中文
 
尝试方法五: 在@RequestMapping里的并发配置produces={"text/html;charset=UTF-8;","application/json;"}
[java]  view plain copy 在CODE上查看代码片派生到我的代码片
  1. @RequestMapping(value = "***",produces={"text/html;charset=UTF-8;","application/json;"})  


注意: 这里和上个方法的区别是,produces里面的顺序对调了

 
原理: 手动给对应的Accept返回制定格式编码数据。
 
最终结果:
请求方法1返回正确的中文
请求方法2返回正确的中文
请求方法3返回正确的中文
 

方法四和方法五对比分析:

发现produces设置多个Accept只有第一个的charset是有用的,
后面的Accept设置有效(因为不设置就无法接收对应的Accept请求),但是charset设置是无效的.需要客户端手动制定charset才行.
具体原因并不清楚(原谅我并不精通)
 
所以得出的结论是:
produces={"text/html;charset=UTF-8;","application/json;"}

这样设置,这样普通浏览器的请求就能正常显示中文,而客户端的模拟请求(可以是ajax或http)则手动指定Accept的charset,即可正常接收中文。

客户端使用Ajax请求跨域问题

说明:刚刚搭建的Java web后台程序,用Http请求很正常,但是用普通的ajax请求时,出现了一个跨域问题,被拒绝访问.
 
解决办法:
在.net后台布置在IIS服务器上的,直接可以在IIS的应用池中配置Access-Control-Allow-Origin: *就行了.
PhP后台也只需要手动配置
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept');
 
Java Web后台可以再对应的tomcat服务器上通过CORS配置跨域访问(详情见另一篇),这里暂时只探讨Java Web的JSONP实现
 
于是:  这里的Java Web后台采用了JSONP传输方式来支持跨域.
(缺点就是只支持Get,而且需要服务器端有JSONP的判断,因为返回参数和普通的不一样)
 
JSONP前端代码:(这里是用了JQ的jsonp请求)
 
[javascript]  view plain copy 在CODE上查看代码片派生到我的代码片
  1. <span style="white-space:pre">                    </span>$.ajax(url, {  
  2.                         data: data,  
  3.                         dataType: "jsonp",  
  4.                         jsonpCallback: 'testGetData',  
  5.                         timeout: "15000", //超时时间设置为3秒;  
  6.                         type: "POST",  
  7.                         success: function(response) {  
  8.                             var result = 'success:' + JSON.stringify(response);  
  9.                             //返回的是utf8编码,需要手动转为utf16  
  10.                             console.log(result);  
  11.                             //alert(result);  
  12.                         },  
  13.                         error: function(error) {  
  14.                             var result = 'error:' + JSON.stringify(error);  
  15.                             console.log(result);  
  16.                             //alert(result);  
  17.                         }  
  18.                     });  


JSONP传递Java Web后台代码片段:

1.在方法的最开头获取是否是JSONP请求-通过获取callback参数
[java]  view plain copy 在CODE上查看代码片派生到我的代码片
  1. //判断是否是jsonp请求  
  2. String jsoncallback = request.getParameter("callback");  

2.判断如果是JSONP的请求则用JSONP的返回参数,否则用正常的(示例里面使用了Jackson来辅助)

[java]  view plain copy 在CODE上查看代码片派生到我的代码片
  1. public static String getJsonPData(String callbackName,Map<String, Object> data) throws JsonGenerationException, JsonMappingException, IOException{  
  2.         ObjectMapper mapper = new ObjectMapper();  
  3.               
  4.         String json = mapper.writeValueAsString(data);  
  5.         System.out.println("jsonp回调:"+callbackName);  
  6.         System.out.println("jackson解析的字符串:"+json);  
  7.         String result = "";  
  8.         if(callbackName==null||callbackName==""){  
  9.             //普通请求  
  10.             result = json;  
  11.         }else{  
  12.             //jsonp请求,返回的格式是类似于一个函数的字符串形式(前端再执行这个回调来获取数据)  
  13.             result = callbackName+"("+json+")";  
  14.         }  
  15.         System.out.println("最终结果:"+result);  
  16.         return result;    
  17.     }  
NMOS管和PMOS管做开关控制电路 阅读详情

相关推荐

【保姆级教程】不到一元32位芯片 DIY迷你时钟

基于不到一元的CH32V003F4P9芯片制作的迷你多功能时钟。

twen51的博客 1813

SpringMvc 遇到的坑,返回中文乱码以及Ajax跨域

前言: 最近在写一个Java Web后台时采用了Spring+MyBatis+MySql的方式.记录下遇到的关键问题 接口返回数据相关 使用@ResponseBody后返回NUll 说明:刚把后台运行起来,兴高采烈的测试接口数据,结果无论如何都是返回null, 最终通过各种百度,发现原来是没有引入关键的Jar包. 解决办法: 需要引入jackson的jar包(jackso

撒网要见鱼的专栏 2万+

【各种轮子2】基于Icepak的PCB散热仿真比较

随着电子产品的集成度越来越高,PCB板的尺寸越来越小,板级芯片散热的问题越来越成为电子工程师的一个重要挑战。对于板级芯片散热,主要依靠工程师对PCB自身的设计进行优化,同时要兼顾系统的尺寸和成本。本文分别从芯片角度和PCB角度进行建模,芯片模型选用QFN封装,PCB模型采用走线导入模型,探讨了芯片结构,PCB铜厚,PCB叠层厚度对芯片散热的影响。

3668

ajax中文乱码

ajax乱码解决总结 第一,javascript沿用java的字符处理方式,内部是使用unicode来处理所有字符的, 第二,utf-8是每个汉字(unicode字符)用3个字节来存储。 第三,用utf-8来send数据是不会出现乱码的,是后台程序没有正确解码才会出现乱码。 第四,ajax发送数据的时候如果修改 Content-Type 为 application/x-www-form-

周天祥的博客 10万+

AI初识—LLM、Ollama、Llama都是些个啥?

LLM指的是大语言模型(Large Language Model),是一种基于深度学习的模型,能够理解和生成自然语言。它通过大量文本数据进行训练,具备了理解上下文、生成连贯文本和回答问题的能力。著名的LLM包括OpenAI的GPT系列和Google的BERT。在AI技术快速发展的背景下,LLM、Ollama和Llama代表了现代自然语言处理的不同方面。LLM为我们提供了强大的语言理解能力,Ollama为模型的部署和管理提供了便利,而Llama则在效率和多样性上不断推进。

小蜗牛的珍贵百宝箱 4627

WSL2不能上网,Failed to connect to github.com port 443问题解决方案

WSL2不能上网: 问题:ping外网无效 例如:ping www.baidu.com失败 解决方案: 在wsl: $sudo vi /etc/wsl.conf wsl.conf: [network] generateResolvConf = false 在PowerShell: $sudo vi /etc/etc/resolv.conf resolv.conf: # This file was automatically generated by WSL. To stop automatic gen

Jason_Chen__的博客 9525

AJAX传输数据的中文乱码之完全解决方案

[解决方法一]以前我曾经贴过一篇用XMLHTTP Post Form 的帖子,那里的代码中我Post E文的Value毫无问题,但是后来发现Post含有中文的表单时会出现乱码,原因当然是UTF-8 和GB2312 之间的转换问题了!TNND,打倒GB2312!大家都用UTF8多好。用XMLHTTP Post Form时的表单乱码有两方面的原因——Post表单数据时中文乱码;服务器Respons

lne818的专栏 3624

Infinite-Canvas:一站式AI绘画工作流平台部署与实战指南

在 AI 绘画和内容创作领域,你是否经常遇到这样的困扰:灵感来了,却要在多个工具间来回切换——找素材、写提示词、调整参数、批量生成,整个过程繁琐且低效。创作一个系列作品时,管理不同版本的图片和提示词更是让人头疼。如果你渴望一个能整合所有流程,实现从素材管理、提示词工程到批量出图一站式完成的工作台,那么今天介绍的 Infinite-Canvas 正是为你量身打造的解决方案。 Infinite-Canvas 是一个开源的本地网页应用,它将 AI 绘画的完整工作流集成在一个界面中。无论你是想快速生成单张图片,还是

weixin_28707535的博客 337

Ajax解决中文乱码问题

    在请求发送和接受请求过程中,常常会遇到中文乱码问题,结果在页面中显示乱码问题,在Ajax中如何解决乱码问题呢,可采用如下的两种方式解决: 1、页面的js做两次encodeURI,服务器的的serverlet获取后做一次utf-8转码,因为前两次进行编码后都变成了英文的字节码,所以到服务器端无论如何解码都不会错误,推荐使用该方法。 (1)js的代码 var url = "AJAXS...

gaojie1190的专栏 1342

把外部系统接到 SAP Build Process Automation 的两条路:前台直连与后台编排的完整范式

想把外部系统接入到你的【销售订单管理】审批流程,最稳妥的路径是:在流程里开一个,在 BTP 配好以为核心的 Destination,让前端经由approuter代理、后台通过 Cloud SDK 直连,任务处理用My Inbox或Task APIs,异步对接用。这套组合拳,既满足安全边界与运维规范,又能让前台与后台两个世界各取所需、自然衔接。SAP。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1660

OpenClaw 开机自启配置:Windows/macOS/Linux 全平台技术指南

OpenClaw 开机自启全平台配置指南 本文提供了在Windows、macOS和Linux系统上配置OpenClaw开机自启的完整技术方案。主要内容包括: Windows配置:提供三种方法(Windows服务、任务计划程序、启动文件夹),详细说明服务脚本创建、服务注册和测试流程 macOS配置:使用LaunchAgent实现开机自启,包含配置文件创建和加载方法 Linux配置:通过systemd服务实现,包括服务单元文件创建和启用步骤 系统要求:明确硬件(64位CPU/4GB内存)和软件(各平台操作系统版

一键难忘的博客 2993

ajax中文乱码问题的总结

本章解决在AJAX中常见的中文问题,分析中文乱码产生的原因,以及如何解决乱码问题 1. HTTP协议的编码规定 在HTTP协议中,浏览器不能向服务器直接传递某些特殊字符,必须是这些字符进行URL编码后再进行传送。url编码遵循的规则: 将空格转换为(+) 对0-9,a-z,A-Z之间的字符保持不变。 对于所有其他的字符,用这个字符的当前字...

adjyg64215的博客 513

【银河麒麟桌面系统】安装英伟达(NVIDIA)显卡驱动

本文详细介绍了在麒麟桌面操作系统V10 SP1(版本号2503)上安装NVIDIA RTX 5060显卡驱动的完整流程。主要内容包括:查看系统版本信息,从NVIDIA官网下载Linux 64位驱动,授予执行权限后运行安装程序,处理安装过程中的X server警告、32位库安装、DKMS模块选择等问题,以及安装完成后如何验证驱动状态。同时提供了卸载驱动的步骤和常见问题解决方案,如处理X server警告、libglvnd EGL依赖问题等。该指南适用于需要在国产麒麟系统上安装NVIDIA显卡驱动的用户,包含完

信创运维工程师 · 银河麒麟 & 容器实战 | 金融生产环境迁移·等保加固 | 142篇原创·17万+阅读 6305

ajax后台返回数据中文乱码_ajax提交 返回中文乱码问题

接口返回数据相关使用@ResponseBody后返回NUll说明:刚把后台运行起来,兴高采烈的测试接口数据,结果无论如何都是返回null,最终通过各种百度,发现原来是没有引入关键的Jar包.解决办法:需要引入jackson的jar包(jackson core和jackson mapper),引入后图:使用@RequestMapping返回中文乱码原因分析:(网上基本都是一致的答案)首先:确定的是(...

weixin_39650745的博客 1828

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

假人有限元模型

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

php ajax 提交返回的数据乱码问题,GBK编码 ajax提交中文 并 返回中文内容 乱码

开发环境: 所有文件编码为GBK、ajax提交中文到sms.php、sms.php返回中文json1、首先勾选要发送的用户,然后点击发送短信,输入中文,点击确认后将电话号码和中文字符ajax提交到sms.php。 sms.php $_POST获取中文乱码开始的时候在ajax请求的时候加入了contentType: "application/x-www-form-urlencoded;charse...

weixin_29589357的博客 348

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

ajax返回中文乱码,servlet中的显示乱码,post提交的乱码问题,编码大总结

 ajax返回中文乱码问题解决使用ajax获取服务器数据返回给客户端,出现中文乱码。在之前的一个ajax应用中指定codepage=936,将所有页面编码都指定为GB2312即可解决。这 次的应用中却无起作用了,经过多次的试验,客服端的编码应该绝对没有问题的。可以判断问题一定出在服务器端。稍微分析一下可知虽然服务器端指定了文件的编 码格式,但对于服务器输出流就成为了怀疑的对象。由于使用MS

qsd007的专栏 2158

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

ajax提交 后台返回中文乱码问题

接口返回数据相关使用@ResponseBody后返回NUll说明:刚把后台运行起来,兴高采烈的测试接口数据,结果无论如何都是返回null,最终通过各种百度,发现原来是没有引入关键的Jar包.解决办法: 需要引入jackson的jar包(jackson core和jackson mapper),引入后图:  使用@RequestMapping返回中文乱码原因分析:(网上基本都是一致的答案)首先: 确...

zcouy的博客 2581

ajax提交 返回中文乱码问题

接口返回数据相关 使用@ResponseBody后返回NUll 说明:刚把后台运行起来,兴高采烈的测试接口数据,结果无论如何都是返回null, 最终通过各种百度,发现原来是没有引入关键的Jar包. 解决办法:需要引入jackson的jar包(jackson core和jackson mapper),引入后 图: 使用@RequestMapping返回中文乱码...

weixin_34303897的博客 298

87.ajax提交 后台返回中文乱码问题

接口返回数据相关 使用@ResponseBody后返回NUll 说明:刚把后台运行起来,兴高采烈的测试接口数据,结果无论如何都是返回null, 最终通过各种百度,发现原来是没有引入关键的Jar包. 解决办法: 需要引入jackson的jar包(jackson core和jackson mapper),引入后 图:     使用@Reque

DarrenMJ的博客 3815

java ajax返回值编码_java中编码问题导致ajax提交中文乱码

对于ajax乱码多半是中文导致的乱码了,因为中文如果不转换在uft8就无法通过ajax传递操作了,具体如下。ajax碰到过两问题,一个是时间问题,一个是中文乱码问题。因为项目都是在谷歌浏览器做的。所以一直没有发现别的浏览器问题,测试的时候才发现ie,360 等出现点击ajax所在的方法失效刚开始一直以为是js不兼容。调试下发现是前台传值发现乱码,坑。。然后 把中文先转码最后后台再解码就可以了。。下...

weixin_33628316的博客 309

Ajax回调函数返回的中文字符串乱码问题

通过ajax提交请求,返回的response所带的中文字符串一直显示为乱码,写了如下代码也无效: response.setCharacterEncoding("UTF-8"); response.getWriter().print("返回结果");   后来在web.xml 添加如下描述,终于解决问题: <filter> ...

Vito0709的博客 372

JavaScript传中文值给Action出现乱码问题解决和返回ajax 返回 输出 json 乱码

JavaScript传中文值给Action出现乱码问题解决 1、在通过js传值给Action前,运用encodeURIComponent() 函数先对要传的值进行编码。 2、然后在Action里获取编码并把编码转化成中文编码格式。 3、具体运用如下:在JavaScript里编码: var value= encodeURIComponent(strValue);//对strValue进行

lijingzhu的专栏 2937

ajax后台返回数据中文乱码_Ajax返回中文数据乱码的解决方法

本文最后更新于2017年1月13日,已超过半年没有更新,如果内容失效,请在评论区反馈,谢谢!最近在用到Ajax.request时,发现从ASP返回的参数如果是中文数据就很容易产生乱码,但是我的页面已经是UTF-8编码了,在网上找了很多资料,最后发现在响应页的页头加上如下代码就可以了:当然如果你用的是gb2312就加入这句:Response.Charset = "gb2312"网上有朋友提供如下代码...

weixin_39610415的博客 934

ajax php 中文乱码,解决ajax+php中文乱码的方法详解

解决ajax+php中文乱码的方法详解中文如果用表单提交的话,不会出现乱码,而用ajax提交就会出现乱码,这是什么原因呢?我的理解是,我在写源码的时候,一般用记事本写,保存的时候默认用ANSI编码,源码中也没有用“”或“header('Content-Type:text/html;charset=UTF-8');”指定网页编码,于是在浏览器中显示时它的编码被认定为“GB2312”。当前台向后台传递...

weixin_40004051的博客 586
上一篇: SpringMVC ajax传值问题
下一篇: SpringMVC+AJAX登录表单验证问题
祯民
博客等级 码龄9年 72粉丝 174原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值