zoukankan      html  css  js  c++  java
  • SpringMVC 学习-返回字符串中文乱码问题解决

    一、使用 SpringMVC 框架时,如果 HTTP 请求资源返回的是中文字符串,则会出现乱码。原因如下:

    SpringMVC 框架可以使用 @RequestBody 和 @ResponseBody 两个注解,分别完成请求到对象和对象到响应的转换,底层这种灵活的响应机制,就是Spring3.X 新引入的 HttpMessageConverter 即消息转换器机制。该机制默认的编码为 ISO-8859-1

    源码如下:

    public class StringHttpMessageConverter extends AbstractHttpMessageConverter<String> {
        public static final Charset DEFAULT_CHARSET = Charset.forName("ISO-8859-1");

    二、那这种情况该怎么解决呢

    经本人测试有效的解决办法,有如下两个:

    1. 在 @RequestMapping 里面加入 produces="text/html;charset=UTF-8"

    @ResponseBody
    @RequestMapping(value="/logon",produces="text/html; charset=UTF-8")
    public String logon(){
    }

    这种方式的不足之处在于,我们的每个 controller 都需要这么配置,算是比较麻烦。

    那还有其他省事的、一劳永逸的办法吗?有的。

    2. 使用 Spring 的后置处理器 BeanPostProcessor

    对这个类不太了解的,见:http://www.cnblogs.com/libra0920/p/6118157.html 有一个简单的说明。

    在 bean 实例化之后,当 bean 的类型为 StringHttpMessageConverter 时,设置 @responseBody 返回数据编码为 utf8 格式。

    /**
     * 实例化之后进行处理
     */
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
      if(bean instanceof StringHttpMessageConverter){
        MediaType mediaType = new MediaType("text", "plain", Charset.forName("UTF-8"));
        List<MediaType> types = new ArrayList<MediaType>();
        types.add(mediaType);
        ((StringHttpMessageConverter) bean).setSupportedMediaTypes(types);
      }
      return bean;
    }

    以上。

    摆脱乱码困扰。

  • 相关阅读:
    sql强化训练(4)
    Python中用PIL/Pillow裁剪图片
    Python中用PIL/Pillow旋转图片
    server项目部署服务器
    ZOJ Monthly, June 2012 [7月9日暑假集训]
    模线性方程(递归版+迭代版)& 扩展欧几里德
    线性筛素数
    First Bangladeshi Contest 20122013 Season[7月12日暑假集训]
    36th ACM/ICPC Asia Regional Daejeon(韩国大田) [7月7日暑假集训]
    MillerRabin 素性测试
  • 原文地址:https://www.cnblogs.com/libra0920/p/6121612.html
Copyright © 2011-2022 走看看