- 问题场景:采用传统的JSP但是用了前后端分离,使用JSON传输数据,
- JSP设置都是正确的:
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8"%>
- web.xml 的编码过滤器配置并没有用。
- JSP设置都是正确的:
参考博客 Spring MVC 响应报文乱码
参考博客 解决Spring MVC @ResponseBody返回中文字符串乱码问题
最终找到合适的方法, 并调整了下配置,更适合JSON
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<!-- 如果是前后端使用JSON作为主要数据交换格式就把JSON列为第一个, 否则就会被认为是Text -->
<value>application/json; charset=UTF-8</value>
<value>text/plain; charset=UTF-8</value>
<value>text/html; charset=UTF-8</value>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
而且以上的配置也解决了一个一直困扰我的JS操作Ajax返回的JSON问题:
- 直接点引用属性或者a[‘b’]的方式,
- 迭代集合:自带foreach循环
data.forEach(function(value){})
- 迭代集合:自带foreach循环
- 但是有时候不能使用,会undefined,eval(‘(‘+data+’)’)解析后才能用
- 原因在于Response Headers 的
Content-Type:application/json;charset=UTF-8
如果回应的类型是 text/plain 就需要使用 eval(‘(‘+data+’)’)才能用 - 如果设置成JSON就可以直接点引用和循环迭代
- 原因在于Response Headers 的
- 直接点引用属性或者a[‘b’]的方式,
有一篇博客提到了查看Ajax请求的响应头信息才让我恍然大悟,所以调整上述的配置默认将请求优先设置为JSON格式数据返回,正好适合这种应用场景