SpringMVC-设置UTF-8编码

SpringMVC - 设置UTF-8编码

参考

  • sxhjhf - springMVC @response 中文乱码解决
    修改Response的编码, 这是基于xml配置文件的方法.
  • spring-mvc-utf-8-encoding
    这是基于xml配置的, 关于输入的编码的问题.

全局修改输出为UTF-8编码

  1. xml 方法
    sxhjhf - springMVC @response 中文乱码解决


    
    
        
            
                
            
        
    

  1. annotation方法
    由方法1, 我们可以看到一个起关键作用的类org.springframework.http.converter.StringHttpMessageConverter. 打开源码可以发现:
    public class StringHttpMessageConverter extends AbstractHttpMessageConverter {
        // 省略 ....
        public static final Charset DEFAULT_CHARSET = Charset.forName("ISO-8859-1");
        private final List availableCharsets;
        private boolean writeAcceptCharset = true;
        
        public StringHttpMessageConverter(Charset defaultCharset) {
            super(defaultCharset, MediaType.TEXT_PLAIN, MediaType.ALL);
            this.availableCharsets = new ArrayList(Charset.availableCharsets().values());
        }
        // 省略 ....
    }

可以看到, 默认编码已经被设定为了Charset.forName("ISO-8859-1"). 所以我们需要想办法替换掉这个默认编码. 方法1是通过xml加载了参数为UTF-8StringHttpMessageConverter.
回到使用注解配置的Java代码中:
因为配置SpringMVC的类, 需要继承于WebMvcConfigurerAdapter, 我们可以看看里面有没有相关方法可用.

public abstract class WebMvcConfigurerAdapter implements WebMvcConfigurer{...}
// 所以继续看WebMvcConfigurer
public interface WebMvcConfigurer {
    /**
     * Configure the {@link HttpMessageConverter}s to use for reading or writing
     * to the body of the request or response. If no converters are added, a
     * default list of converters is registered.
     * 

Note that adding converters to the list, turns off * default converter registration. To simply add a converter without impacting * default registration, consider using the method * {@link #extendMessageConverters(java.util.List)} instead. * @param converters initially an empty list of converters */ void configureMessageConverters(List> converters); /** * A hook for extending or modifying the list of converters after it has been * configured. This may be useful for example to allow default converters to * be registered and then insert a custom converter through this method. * @param converters the list of configured converters to extend. * @since 4.1.3 */ void extendMessageConverters(List> converters); }

可以看到configureMessageConvertersextendMessageConverters两个方法. 区别是前者会覆盖掉默认的Converter, 而后者是扩展. 所以我们只需要在我们继承于WebMvcConfigurerAdapter这个类的实现中覆盖掉configureMessageConverters方法即可.
实现如下:

@Configuration
@EnableWebMvc
@ComponentScan("me.xiaofud.spring101.spittr.web")
public class WebConfig extends WebMvcConfigurerAdapter {
    @Override
    public void configureMessageConverters(List> converters) {
        StringHttpMessageConverter stringHttpMessageConverter = new StringHttpMessageConverter(Charset.forName("UTF-8"));
        stringHttpMessageConverter.setWriteAcceptCharset(false);
        converters.add(stringHttpMessageConverter);
    }

测试:

curl -I -X POST "http://localhost:8080/app/post/add"
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Type: text/plain;charset=UTF-8
Content-Length: 1338
Date: Sun, 12 Nov 2017 14:17:49 GMT

修改读取参数时候的编码

web.xml中:
添加一个filter, 注册org.springframework.web.filter.CharacterEncodingFilter.

  
    encodingFilter  
    org.springframework.web.filter.CharacterEncodingFilter  
      
       encoding  
       UTF-8  
      
      
       forceEncoding  
       true  
      
  
  
    encodingFilter  
    /*  
 

你可能感兴趣的:(SpringMVC-设置UTF-8编码)