接口返回数据相关

使用@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中有中文时会出现乱码。
  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中添加如下代码

  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中添加如下代码

  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;"

  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;"}

  1. @RequestMapping(value = "***",produces={"application/json;","text/html;charset=UTF-8;"})

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

 
最终结果:
请求方法1返回中文乱码
请求方法2返回中文乱码
请求方法3返回正确的中文
 

尝试方法五: 在@RequestMapping里的并发配置produces={"text/html;charset=UTF-8;","application/json;"}

  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请求)
 
  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参数
  1. //判断是否是jsonp请求
  2. String jsoncallback = request.getParameter("callback");

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

  1. public static String getJsonPData(String callbackName,Map<String, Object> data) throws JsonGenerationException, JsonMappingException, IOException{
  2. ObjectMapper mapper = new ObjectMapper();
  3. String json = mapper.writeValueAsString(data);
  4. System.out.println("jsonp回调:"+callbackName);
  5. System.out.println("jackson解析的字符串:"+json);
  6. String result = "";
  7. if(callbackName==null||callbackName==""){
  8. //普通请求
  9. result = json;
  10. }else{
  11. //jsonp请求,返回的格式是类似于一个函数的字符串形式(前端再执行这个回调来获取数据)
  12. result = callbackName+"("+json+")";
  13. }
  14. System.out.println("最终结果:"+result);
  15. return result;
  16. }

ajax提交 返回中文乱码问题的更多相关文章

  1. Ajax提交后台中文乱码问题

    今天项目组同事反映,之前有一个正常的请求,今天突然后台获取参数的值出现了中文乱码,怀疑是之前更新jar包所致,笔者仔细想了想更新的内容,仿佛没有涉及到编码的变更啊,然后开始排查,首先后台加了强制以ut ...

  2. struts2 action获取ajax提交数据中文乱码问题

    有个人和我问题相同,地址在这: 解决方法: 在ajax的属性添加这句:contentType:'application/x-www-form-urlencoded; charset=utf-8',

  3. spring ajax以及页面返回中文乱码问题解决

    在spring配置文件中添加 <!--返回中文乱码--> <mvc:annotation-driven > <!-- 消息转换器 --> <mvc:messa ...

  4. Springboot @ResponseBody返回中文乱码

    最近我在把Spring 项目改造Springboot,遇到一个问题@ResponseBody返回中文乱码,因为response返回的content-type一直是application/json;ch ...

  5. Tomcat JSP提交参数中文乱码问题解决

    参考: http://blog.csdn.net/error_case/article/details/8250209 中文乱码是个老生常谈的问题,一般情况下,只要保证页面,web服务器,数据库的编码 ...

  6. jquery的ajax()函数传值中文乱码解决方法介绍

    jquery的ajax()函数传值中文乱码解决方法介绍,需要的朋友可以参考下 代码如下: $.ajax({ dataType : ‘json', type : ‘POST', url : ‘http: ...

  7. form提交数据中文乱码问题总结

    一:form在前台以post方式提交数据: 浏览器将数据(假设为“中国”)发送给服务器的时候,将数据变成0101的二进制数据(假设为98 99)时必然要查码表,浏览器以哪个码表打开网页,浏览器就以哪个 ...

  8. ajax()函数传值中文乱码解决方法介绍

    jquery的ajax()函数传值中文乱码解决方法介绍,需要的朋友可以参考下 复制代码 代码如下: $.ajax({ dataType : ‘json',type : ‘POST',url : ‘ht ...

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

    SpringMVC的@ResponseBody返回中文乱码的原因是SpringMVC默认处理的字符集是ISO-8859-1,在Spring的org.springframework.http.conve ...

随机推荐

  1. FineUIMvc随笔(3)不能忘却的回发(__doPostBack)

    声明:FineUIMvc(基础版)是免费软件,本系列文章适用于基础版. 用户反馈 有网友在官方论坛抛出了这么一个问题,似乎对 FineUIMvc 中的浏览器端与服务器端的交互方式很有异议. 这里面的关 ...

  2. 图解Redis之数据结构篇——链表

    前言     Redis链表为双向无环链表!     图解Redis之数据结构篇--简单动态字符串SDS提到Redis使用了简单动态字符串,链表,字典(散列表),跳跃表,整数集合,压缩列表这些数据结构 ...

  3. Omi教程-组件通讯攻略大全

    组件通讯 Omi框架组建间的通讯非常遍历灵活,因为有许多可选方案进行通讯: 通过在组件上声明 data-* 传递给子节点 通过在组件上声明 data 传递给子节点 (支持复杂数据类型的映射) 父容器设 ...

  4. 《React Native 精解与实战》书籍连载「Node.js 简介与 React Native 开发环境配置」

    此文是我的出版书籍<React Native 精解与实战>连载分享,此书由机械工业出版社出版,书中详解了 React Native 框架底层原理.React Native 组件布局.组件与 ...

  5. NFV论文集(二)

    一 文章名称:VNF Placement with Replication for Load Balancing in NFV Networks 发表时间:2017 期刊来源:ICC: IEEE In ...

  6. Python的socket模块与交互式指令

    socket简介 在编程的过程中,我们需要使用网络编程,这时我们不得不和网络通信的底层基础打交道了.我们必须让自己传输的数据符合网络通信的基本协议,即TCP/IP协议,但是网络通信协议本身很复杂.我们 ...

  7. Day2 Numerical simulation of optical wave propagation之标量衍射理论基本原理(二)

    2.麦克斯韦方程组的简单行波解 讨论通过线性.各向同性.均匀.无色散.无限电荷和电流的电介质材料的光波传输.在这种情况下,介质具有如下属性: (1)推导获得波动方程( 由麦克斯韦方程组导出的.描述电磁 ...

  8. Vue2.0 搭建Vue脚手架(vue-cli)

    介绍 Vue.js是一套构建用户界面的渐进式框架.Vue 只关注视图层,采用自底向上增量开发的设计.Vue 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件. 阅读之前需要了解的知 ...

  9. Django之ORM操作(聚合 分组、F Q)

    Django之ORM操作(聚合 分组.F Q) 聚合 aggregate()是QuerySet的一个终止子句,也就是说,他返回一个包含一些键值对的字典,在它的后面不可以再进行点(.)操作.   键的名 ...

  10. 【转】Linux下cp: omitting directory `XXX'问题解决

    在linux系统中复制文件夹时提示如下: Shell代码 [root@idtp4 site-packages]# /site-packages/ cp: omitting directory ‘yag ...