After understanding the operation principles and main notes of Spring Boot, we will now briefly analyze the built-in configuration function of Spring Boot: the coding configuration of http.
When we configure Http coding in regular projects, we add a filter to web.xml, such as:
<filter> <filter-name>CharacterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>utf-8</param-value> </init-param> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter>
Automatic configuration needs to satisfy two conditions:
- Can configure Character Encoding Filter Bean;
- It can configure encoding and forceEncoding parameters.
1 Configuration parameter
In the previous section, we described the type-safe configuration, and Spring Boot is based on this. The configuration class can be set directly in application.properties. The source code is as follows:
package org.springframework.boot.autoconfigure.web; import java.nio.charset.Charset; import java.util.Locale; import java.util.Map; import org.springframework.boot.context.properties.ConfigurationProperties; @ConfigurationProperties(prefix = "spring.http.encoding")// The prefix configured in application.properties is spring.http.encoding public class HttpEncodingProperties { public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8"); private Charset charset = DEFAULT_CHARSET; // Default encoding mode private Boolean force; private Boolean forceRequest; private Boolean forceResponse; private Map<Locale, Charset> mapping; public Charset getCharset() { return this.charset; } public void setCharset(Charset charset) { this.charset = charset; } public boolean isForce() { return Boolean.TRUE.equals(this.force); } public void setForce(boolean force) { this.force = force; } public boolean isForceRequest() { return Boolean.TRUE.equals(this.forceRequest); } public void setForceRequest(boolean forceRequest) { this.forceRequest = forceRequest; } public boolean isForceResponse() { return Boolean.TRUE.equals(this.forceResponse); } public void setForceResponse(boolean forceResponse) { this.forceResponse = forceResponse; } public Map<Locale, Charset> getMapping() { return this.mapping; } public void setMapping(Map<Locale, Charset> mapping) { this.mapping = mapping; } boolean shouldForce(Type type) { Boolean force = (type == Type.REQUEST ? this.forceRequest : this.forceResponse); if (force == null) { force = this.force; } if (force == null) { force = (type == Type.REQUEST); } return force; } enum Type { REQUEST, RESPONSE } }
2 configure Bean
Look at the source code by calling the above configuration and configuring the Bean of CharacterEncoding Filter according to the conditions:
package org.springframework.boot.autoconfigure.web; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication; import org.springframework.boot.autoconfigure.web.HttpEncodingProperties.Type; import org.springframework.boot.context.embedded.ConfigurableEmbeddedServletContainer; import org.springframework.boot.context.embedded.EmbeddedServletContainerCustomizer; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.boot.web.filter.OrderedCharacterEncodingFilter; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.Ordered; import org.springframework.web.filter.CharacterEncodingFilter; @Configuration @EnableConfigurationProperties(HttpEncodingProperties.class) // Open property injection @ConditionalOnWebApplication @ConditionalOnClass(CharacterEncodingFilter.class) // When Character Encoding Filter under the condition of similar road strength @ConditionalOnProperty(prefix = "spring.http.encoding", value = "enabled", matchIfMissing = true)// When spring.http.encoding=enabled is set, if the default is true, the condition is met. public class HttpEncodingAutoConfiguration { private final HttpEncodingProperties properties; public HttpEncodingAutoConfiguration(HttpEncodingProperties properties) { this.properties = properties; } @Bean// Configuring Bean s of Character Encoding Filter in java @ConditionalOnMissingBean(CharacterEncodingFilter.class)// When there is no Bean in the container 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; } @Bean public LocaleCharsetMappingsCustomizer localeCharsetMappingsCustomizer() { return new LocaleCharsetMappingsCustomizer(this.properties); } private static class LocaleCharsetMappingsCustomizer implements EmbeddedServletContainerCustomizer, Ordered { private final HttpEncodingProperties properties; LocaleCharsetMappingsCustomizer(HttpEncodingProperties properties) { this.properties = properties; } @Override public void customize(ConfigurableEmbeddedServletContainer container) { if (this.properties.getMapping() != null) { container.setLocaleCharsetMappings(this.properties.getMapping()); } } @Override public int getOrder() { return 0; } } }