SpringBoot中解决中文乱码问题

SpringBoot中解决中文乱码问题


 SpringBoot中解决中文乱码问题

1).在application.properties里面配置

#编码格式

spring.http.encoding.force=true

spring.http.encoding.charset=UTF-8

spring.http.encoding.enabled=true

server.tomcat.uri-encoding=UTF-8

或者在application.yml里面配置

spring:

  http:

    encoding:

      charset: UTF-8

      force: true

      enabled: true

2)[email protected]中增加produces="application/json;charset=utf-8"属性

@RequestMapping(value = "/getUserName",produces="application/json;charset=utf-8")

    public String getUserName() {

        return "张三";

    }

3)过滤器的使用

//字符编码过滤器

@WebFilter(urlPatterns = "/*",filterName = "CharacterEncodingFilter")

public class CharacterEncodingFilter implements Filter{

    @Override

    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override

    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

        HttpServletRequest request = (HttpServletRequest) servletRequest;

        HttpServletResponse response = (HttpServletResponse) servletResponse;

        request.setCharacterEncoding("UTF-8");

        response.setCharacterEncoding("UTF-8");

        filterChain.doFilter(request , response);

    }

    @Override

    public void destroy() {

    }

}

4). java配置写一个字符编码配置类

/**

* 中文乱码解决

*/

@Configuration

public class CharsetConfig extends WebMvcConfigurerAdapter {

    @Bean

    public HttpMessageConverter<String> responseBodyConverter() {

        StringHttpMessageConverter converter = new StringHttpMessageConverter(

                Charset.forName("UTF-8"));

        return converter;

    }

    @Override

    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {

        super.configureMessageConverters(converters);

        converters.add(responseBodyConverter());

    }

    @Override

    public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {

        configurer.favorPathExtension(false);

    }

}

 

StringHttpMessageConverter是一个请求和响应信息的编码转换器,

通过源码我们发现默认编码ISO-8859-1,不是UTF-8,

所以我们只要通过上述配置将请求字符串转为UTF-8 即可SpringBoot中解决中文乱码问题

WebMvcConfigurerAdapter 是springmvc的一个配置支配器类,我们可以实现我们感兴趣的方法。

SpringBoot中解决中文乱码问题

其实现的接口WebMvcConfigurer 定义了一些回调方法为springmvc提供一个通道通过java基本的配置。

SpringBoot中解决中文乱码问题


5).向Spring注册一个自定义的StringHttpMessageConverter用于string转码

// 基于Springboot2.0.1.RELEASE

import com.simply.zuozuo.interceptor.HandleInterceptorImpl;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

import org.springframework.http.converter.HttpMessageConverter;

import org.springframework.http.converter.StringHttpMessageConverter;

import org.springframework.web.servlet.config.annotation.ContentNegotiationConfigurer;

import org.springframework.web.servlet.config.annotation.InterceptorRegistry;

import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;

import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;

import java.nio.charset.Charset;

import java.util.List;

@Configuration

public class WebMvcConfig extends WebMvcConfigurationSupport {

    @Bean

    public HttpMessageConverter<String> responseBodyConverter() {

        return new StringHttpMessageConverter(Charset.forName("UTF-8"));

    }

    @Override

    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {

        converters.add(responseBodyConverter());

        // 这里必须加上加载默认转换器,不然bug玩死人,并且该bug目前在网络上似乎没有解决方案

        // 百度,谷歌,各大论坛等。你可以试试去掉。

        addDefaultHttpMessageConverters(converters);

    }

    @Override

    public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {

        configurer.favorPathExtension(false);

    }

}