最近在项目的使用过程中发现在springmvc的项目中,使用返回页面的请求方式,数据都能正常显示,但是对于ajax的请求,始终显示乱码。

首先第一种是因为我们在web.xml中配置了spring的字符编码过滤器,那么使用ajax请求为什么就不行了呢?

下面简单的分析一下,仅供参考。

先列出简单的请求代码:

//Java代码
@Controller
@RequestMapping("Goods")
public class GoodsController { @RequestMapping(value="page")
@ResponseBody
public String page(){
JSONObject jo = new JSONObject();
jo.put("page", "测试");
return jo.toString();
}
}
<!-- Ajax代码 -->
$.ajax({
url : "/EASY_BUY_SSM/Goods/page.action",
type : "POST",
contentType : "application/x-www-form-urlencoded",
dataType : "json",
success : function(data) {
var page = data.page;
var goodsList = page.newsList;
apendGoods(goodsList);
}
});
 <!-- web.xml -->

    <filter>
<filter-name>EncodingFilter</filter-name>
<filter-class>com.smy.util.EncodingFilter</filter-class>
<init-param>
<param-name>encode</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter> <filter-mapping>
<filter-name>EncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

首先,当一个请求到来时,会先经过spring的这个过滤器CharacterEncodingFilter,过滤器设置好编码之后会

进入springmvc的这个DispatcherServlet,通过springmvc的一系列转化(此处省略。。。),到达我们的控制层,

并且帮我们封装好了参数。在springmvc中配置这个配置项之后<mvc:annotation-driven>,会默认配置

RequestMappingHandlerAdapter和HttpMessageConverter,当我们使用@ResponseBody时,那么数据返回时

会调用这个数据转换器。经过查看源码可知,默认情况下会转换成ISO-8859-1格式。

简单源码附上:

public class StringHttpMessageConverter extends AbstractHttpMessageConverter<String> {
public static final Charset DEFAULT_CHARSET = Charset.forName("ISO-8859-1");
private final Charset defaultCharset;
private final List<Charset> availableCharsets;
private boolean writeAcceptCharset; protected void writeInternal(String s, HttpOutputMessage outputMessage)
throws IOException {
if (this.writeAcceptCharset) {
outputMessage.getHeaders().setAcceptCharset(getAcceptedCharsets());
}
Charset charset = getContentTypeCharset(outputMessage.getHeaders()
.getContentType());
StreamUtils.copy(s, charset, outputMessage.getBody());
} ...
} public abstract class AbstractHttpMessageConverter<T> implements
HttpMessageConverter<T> {
protected final Log logger = LogFactory.getLog(super.getClass()); private List<MediaType> supportedMediaTypes = Collections.emptyList(); ...
}

通过上面的源码可以看出,对于字符串会自动编码成默认格式ISO-8859-1,所以对应的就有解决方案。

方案一:

  @RequestMapping(value = “page”,produces=”text/html;charset=UTF-8;”)

方案二:

  此注解需要注意的是一定要使用spring 3.1.x 以上。

<mvc:annotation-driven>
<mvc:message-converters register-defaults="true">
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes" value="text/html;charset=UTF-8"/>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>

方案三: 
  不使用@ResponseBody,将请求处理改成如下:

//Java代码
@Controller
@RequestMapping("Goods")
public class GoodsController { @RequestMapping(value="page")
public void page(HttpServletResponse response){
JSONObject jo = new JSONObject();
jo.put("page", "测试");
response.getwriter().write(jo.toString());
}
}

最新文章

  1. 字符串转化为Json格式的数据--(记录四)
  2. 简单的解释XSS攻击
  3. mysql case then使用
  4. 从数组中选出和等于固定值的n个数(JavaScript实现)
  5. x2go
  6. python 数据结构-列表
  7. DEDECMS中,文章页直接输出字段名
  8. VC6项目移植到VS2008的若干问题——好的代码,从我做起,从如今做起。
  9. 具体解释EBS接口开发之物料导入API
  10. commands - `tar`
  11. Mysql安全机制
  12. JAVA_用_JCO连接_SAP,实现调用SAP_的_RFC_函数(整理)(附一篇看起来比较全面的说明)(JCO报错信息)
  13. Git 配置editor编辑器
  14. ZOJ - 3469 Food Delivery (区间dp)
  15. 吐槽一下--最近多次在腾讯以及万科的面试经历---Web前端与PHP后端开发
  16. 深入浅出Git教程(转载)
  17. Golang 入门系列(三)Go语言基础知识汇总
  18. ES6 let&amp;const
  19. openSUSE Leap 15.0 Adobe Flash Player 安装说明
  20. (最长回文子串 线性DP) 51nod 1088 最长回文子串

热门文章

  1. Unbuntu--安装VMware Tools
  2. LOJ #2831. 「JOISC 2018 Day 1」道路建设 线段树+Link-cut-tree
  3. malloc分配内存的结构
  4. shadow文件中密码的加密方式
  5. DataReader类型化数据读取与装箱性能研究
  6. JAVA-&gt;查询并显示输入根目录下全部的文件所在目录路径
  7. P1041 传染病控制【暴搜】
  8. ACM-ICPC 2018 焦作赛区网络预赛 Give Candies 题解
  9. ECMAScript基本语法——⑤运算符 void
  10. Qt Installer Framework翻译(8)