1 提交到后台中文乱码
原因及解决方案
在web.xml中配置最上面配置字符集过滤器
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
2 JSON乱码
//输入
@RequestMapping(value="/json")
@ResponseBody
public String testMap() {
Map map = new HashMap<>();
map.put("name", "中国");
map.put("age",1);
map.put("sex", "man");
return map.toString();
}
//输出
{sex=man, name=??, age=1}
原因及解决办法
Spring 默认的消息转换器StringHttpMessageConverter 中默认的编码是ISO-8859-1
public class StringHttpMessageConverter extends AbstractHttpMessageConverter<String> {
public static final Charset DEFAULT_CHARSET = Charset.forName("ISO-8859-1");
//.......
}
RequestMapping
@RequestMapping(value="/json", produces = "application/json; charset=UTF-8")
3 配置xml 消息转换器
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<!-- @since 4.3 -->
<!-- <property name="defaultCharset" value="UTF-8"></property>
-->
<property name="supportedMediaTypes" value="text/html;charset=UTF-8"/>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
当然推荐xml配置的方式配置,一劳永逸,不用再每个方法上写produces。
当然这只是一种MessageConverter的配置。如果@ResponseBody返回的不是String, 而是User对象或Map等结构数据类型时,配置JSON相关的转换器时也需配置字符集。 使用的最新版Spring 4.3.10。发现配置JSON的时候 只有org.springframework.http.converter.json.MappingJackson2HttpMessageConverter 这个转换器了。MappingJacksonHttpMessageConverter 已经被删除了。而且MappingJackson2HttpMessageConverter父类AbstractJackson2HttpMessageConverter中默认字符集就是UTF-8.这就更加方便配置了。只要配置了JSON转换器为MappingJackson2HttpMessageConverter即可。其他属性默认即可。当然为了统一以前的写法,使项目组其他小伙伴更加清晰,建议明确在xml中配置字符集。
4 最终配置
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<!-- @since 4.3 -->
<!-- <property name="defaultCharset" value="UTF-8"></property>-->
<property name="supportedMediaTypes" value="text/html;charset=UTF-8"/>
</bean>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<!-- @since 4.3 -->
<!-- <property name="defaultCharset" value="UTF-8"></property> -->
<property name="supportedMediaTypes">
<list>
<value>application/json;charset=UTF-8</value>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
5 结语
这可能是比较常见的几种情况,若是各位小伙伴有什么其他情况的话,欢迎补充和指正。