SSM返回中文乱码问题,SpringMVC返回中文乱码,SSM返回String字符串乱码问题

33 篇文章 1 订阅

博客来源:

搭建SSM框架的过程中,发现直接返回String时出现中文乱码问题,但是返回Map、List等不会出现乱码问题……

经过查阅资料发现,这算是SpringMVC的一个bug吧,spring MVC有一系列HttpMessageConverter去处理用@ResponseBody注解的返回值,如返回list或其它则使用 MappingJacksonHttpMessageConverter,返回string,则使用 StringHttpMessageConverter,而这个convert使用的是字符集是iso-8859-1,而且是final的。所以在当返回json中有中文时会出现乱码。

发现问题就是解决了80%的问题的,下面就阐述一下解决办法吧。

(如果出现了非返回String字符串中文时的乱码问题,请检查是否配置了全局的字符编码转换器,或者是否配置正确)

解决办法有两种

  1. 全局的解决方法(略微麻烦,但是一劳永逸)
  2. 局部的解决办法(比较简单,类多时会麻烦)

下面我们进行对这两种方法的探讨

全局的解决方法(略微麻烦,但是一劳永逸)

前提知识(希望有所了解):

Spring中有处理器BeanPostProcessor,可用于bean加载前后逻辑的添加,那么我们的机会来了,我们可以实现BeanPostProcessor在bean加载后对bean中String设置字符编码。然后再注册到容器中去。

在 bean 实例化之后,String在bean 的类型为 StringHttpMessageConverter ,我们可以判断是否是String从而进行字符编码判断。

BeanPostProcessor有两个方法需要实现:postProcessorAfterInitialization、postProcessorBeforeInitialization。

首先我们新建一个类,命名随意,尽量有可读性

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.http.MediaType;
import org.springframework.http.converter.StringHttpMessageConverter;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;

/**
 * @Descrintion: String的后置处理器,处理编码问题,继承BeanPostProcessor 实现Bean的编码转换,解决返回String对象时乱码问题
 * @version: 1.0
 */
public class StringBeanPostProcessor implements BeanPostProcessor{
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        return bean;
    }

    //bean实例化后进行处理,判断bean是否属于StringHttpMessageConverter,如果是的话就配置字符编码
    @Override
    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;
    }
}

注意:

1. 接口中的两个方法都要将传入的bean返回、而不能返回Null。否则getBean将无法取得目标。

2. 如将BeanPostProcessor标记为延迟初始化,则无法注册,自定义逻辑也就无法得到应用。假如你在<beans/>元素的定义中使用了'default-lazy-init'属性,则各个BeanPostProcessor需标记为'lazy-init="false"'。

 我们的类已经搞定了,那么只需要将我们的类添加到配置文件中,对于这个问题就算解决了,class中名字修改为我们的类名

<!-- 加载String的管理器转化器,每当Spring返回时进行字符编码的转换 -->
<bean class="xxxxxxxxx.StringBeanPostProcessor"/>

 OK,全局配置搞定,其实博主也推荐这一种方法,毕竟一劳永逸,对于超级细心或者需要处理乱码不多的情况下也可以考虑下面方法

局部的解决办法(比较简单,类多时会麻烦)

前提知识:

 

在 @RequestMapping 中有一个属性 produces,其可指定返回的类型,以及字符编码

produces中的类别有 text/html,application/xml,application/json三种,需要准确指定返回类型,否则会出转换异常从而找不到资源的错

错误详情可移步————>传送门,因为设置返回类型而出现的资源访问异常

在方法中可添加,类似如下

@ResponseBody
//produces中的类别有 text/html,application/xml,application/json三种,需要准确指定返回类型,否则会出错
@RequestMapping(produces = "application/json;charset=utf-8")
public String test(){
    return "test中文";
}

在类中可添加代码如下,此配置在类中都生效,但优先级没有方法中配置的高

@ResponseBody
//produces中的类别有 text/html,application/xml,application/json三种,需要准确指定返回类型,否则会出错
@RequestMapping(produces = "application/json;charset=utf-8")
@Controller
public class UserLoginControler {
    .......
    .......
    .......
}

解决奇奇怪怪的字符编码问题结束,如果其他编码问题可查看字符编码过滤器是否配置成功

 

 

续一个,不大不小的问题! 也是SpringMVC的坑……(由于问题不大,暂不另起博客了)

问题来源:

编写SSM项目的时候,由于命名问题导致的访问错误,详情看条件吧…还是很容易触发的

前置条件

       1、编写一个user.html            访问路径  http://localhost:8080/xxx项目名xxx/user.html

       2、Controler层有一个user的访问路径   http://localhost:8080/xxx项目名xxx/user

细心看会发现,访问的路径很是相似,但也有不同,可是带有 .html 的,不过在SpringMVC中认为他们是相同的,并且 2 的优先级大于 1 ,导致1访问时报错

 

 

 

 

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值