io.github.dengchen2020.core.config.BaseAutoConfiguration Maven / Gradle / Ivy
package io.github.dengchen2020.core.config;
import io.github.dengchen2020.core.properties.CorsBuilder;
import io.github.dengchen2020.core.properties.ETagBuilder;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.autoconfigure.web.servlet.ConditionalOnMissingFilterBean;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.Ordered;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
import org.springframework.web.filter.ShallowEtagHeaderFilter;
import java.time.Duration;
import java.util.List;
/**
* 基础自动配置
*
* @author dengchen
* @since 2024/5/31
*/
@EnableConfigurationProperties({CorsBuilder.class, ETagBuilder.class})
@PropertySource("classpath:application-core.properties")
@Configuration(proxyBeanMethods = false)
public class BaseAutoConfiguration {
@ConditionalOnProperty(value = "dc.cors.enabled", matchIfMissing = true, havingValue = "true")
@ConditionalOnMissingFilterBean(CorsFilter.class)
@Bean
public FilterRegistrationBean corsFilterFilterRegistrationBean(CorsBuilder builder) {
CorsConfiguration config = new CorsConfiguration();
if (StringUtils.hasText(builder.getAllowedOriginPatterns())) {
config.addAllowedOriginPattern(builder.getAllowedOriginPatterns());
}else if (!CollectionUtils.isEmpty(builder.getAllowedOrigins())) {
config.setAllowedOrigins(builder.getAllowedOrigins());
}else {
config.addAllowedOriginPattern("*");
}
if (!CollectionUtils.isEmpty(builder.getAllowedHeaders())) {
config.setAllowedHeaders(builder.getAllowedHeaders());
}else {
config.addAllowedHeader("*");
}
if (!CollectionUtils.isEmpty(builder.getExposedHeaders())) {
config.setExposedHeaders(builder.getExposedHeaders());
}
if (!CollectionUtils.isEmpty(builder.getAllowedMethods())) {
config.setAllowedMethods(builder.getAllowedMethods());
}else {
config.setAllowedMethods(List.of("GET", "POST", "PUT", "DELETE", "PATCH", "HEAD", "OPTIONS", "QUERY"));
}
if(builder.getAllowCredentials() != null){
config.setAllowCredentials(builder.getAllowCredentials());
}else {
config.setAllowCredentials(true);
}
if(builder.getAllowPrivateNetwork() != null){
config.setAllowPrivateNetwork(builder.getAllowPrivateNetwork());
}else {
config.setAllowPrivateNetwork(false);
}
if(builder.getMaxAge() != null){
config.setMaxAge(builder.getMaxAge());
}else {
config.setMaxAge(Duration.ofDays(30));
}
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", config);
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean<>();
filterRegistrationBean.setFilter(new CorsFilter(source));
filterRegistrationBean.setOrder(Ordered.HIGHEST_PRECEDENCE);
return filterRegistrationBean;
}
@ConditionalOnProperty(value = "dc.etag.enabled", havingValue = "true")
@ConditionalOnMissingFilterBean(ShallowEtagHeaderFilter.class)
@Bean
public FilterRegistrationBean etagFilterFilterRegistrationBean(ETagBuilder builder) {
ShallowEtagHeaderFilter filter = new ShallowEtagHeaderFilter();
if(builder.isWriteWeakETag()) filter.setWriteWeakETag(builder.isWriteWeakETag());
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean<>();
filterRegistrationBean.setFilter(filter);
return filterRegistrationBean;
}
}