转载

Spring Boot中的乱码和编码问题

Spring Boot默认的编码并不是UTF8,在一些表单中中文会有乱码的情况,需要添加一个Filter来解决。

Spring Boot大量使用注解,而不是xml配置文件,所以我们的Filter也使用Java-base的配置模式。

@Beanpublic FiltercharacterEncodingFilter() {
  CharacterEncodingFilter characterEncodingFilter =new CharacterEncodingFilter();
  characterEncodingFilter.setEncoding("UTF-8");
  characterEncodingFilter.setForceEncoding(true);
  return characterEncodingFilter;

编码算不上一个大问题,即使你什么都不管,也有很大的可能你不会遇到任何问题,因为大部分框架都有默认的编码配置,有很多是UTF-8,那么遇到中文乱码的机会很低,所以很多人也忽视了。

Spring系列产品大量运用在网站开发中,而Spring Boot是为了简化配置而出现的,理论上讲Spring Boot应该默认配置UTF-8为默认编码,但是网络上依然可以看到很多关于Spring Boot乱码的文章,大部分解决方案沿用Spring MVC的方案,自定义EncodingFilter。

但是仔细查看Spring Boot的文档,可以看到默认的编码的确是UTF-8

spring.http.encoding.charset=UTF-8 # Charset of HTTP requests and responses. Added to the "Content-Type" header if not set explicitly.
spring.http.encoding.enabled=true # Enable http encoding support.


而相关的配置会在HttpEncodingAutoConfiguration中使用

@Bean
@ConditionalOnMissingBean(CharacterEncodingFilter.class)
public CharacterEncodingFilter characterEncodingFilter() {
CharacterEncodingFilter filter = new OrderedCharacterEncodingFilter();
filter.setEncoding(this.properties.getCharset().name());
filter.setForceRequestEncoding(this.properties.shouldForce(Type.REQUEST));
filter.setForceResponseEncoding(this.properties.shouldForce(Type.RESPONSE));
return filter;
}


而这里你其实可以看到,默认情况下forceRequestEncoding和forceResponseEncoding是为false的。

在配置中自己加上一行

spring.http.encoding.force=true


除了常见的http encoding,Spring Boot中还可以控制这些编码

banner.charset
spring.freemarker.charset
server.tomcat.uri-encoding
spring.mail.default-encoding
spring.messages.encoding
spring.thymeleaf.encoding


只不过这些值默认就设置为UTF-8,而且并需要搭配其他配置开关使用,所以一般不需要管。


原文地址:https://www.huangyunkun.com/2015/02/01/spring-boot-utf8-filter/

正文到此结束
Loading...