SpringBoot 动态过滤自动配置类

问题描述:有时候我们引入SpringBoot的Start组件的时候,默认就根据SPI机制加载了相应的自动配置的类;比如通过META-INF下的spring.factories,来读取你需要默认引入的自动配置的类;但是有时候你不想要这些功能,简单一点来说就是在启动类中过滤掉该类

实现方式一:

@SpringBootApplication(exclude = {KafkaConsumerConfig.class})

功能说明:启动容器时排除指定配置类。

实现方式二:

功能要求:通过一个开关配置或者自定义规则来决定是否加载该类

如何实现:SpringBoot中有一个针对SPI加载的类过滤接口名字AutoConfigurationImportFilter
这个类会在启动的时候通过SPI的机制回调,然后执行它的match方法来绝对目前SPI加载的类是否会被过滤掉;

功能实战:

import org.springframework.boot.autoconfigure.AutoConfigurationImportFilter;
import org.springframework.boot.autoconfigure.AutoConfigurationMetadata;
import org.springframework.context.EnvironmentAware;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;

import java.util.*;

@Component
public class KafkaAutoConfigurationImportFilter implements AutoConfigurationImportFilter, EnvironmentAware {

    private Environment environment;
    /**
     * 过滤的map
     * K : 代表配置文件中的属性是否为true,如果为true的话就会过滤掉value中的值
     * V : 过滤掉configuration的全路径
     */
    private Map<String, String> filterAutoConfigurationMap = new LinkedHashMap<>();

    public KafkaAutoConfigurationImportFilter() {
        filterAutoConfigurationMap
            .put("spring.kafka.consumer.multiple-group", "com.elab.core.kafka.config.KafkaConsumerConfig");
    }

    @Override
    public void setEnvironment(Environment environment) {
        this.environment = environment;
    }

    @Override
    public boolean[] match(String[] autoConfigurationClasses, AutoConfigurationMetadata autoConfigurationMetadata) {

        Set<String> filterClass = new HashSet<>();
        
        // 获取配置文件中的属性名称的值,并决定是否过滤
        filterAutoConfigurationMap.forEach((k, v) -> {
            Boolean enableProperty = this.environment.getProperty(k, Boolean.class);
            if (enableProperty) {
                filterClass.add(v);
            }
        });

        if (filterClass.size() > 0) {
            boolean[] skip = new boolean[autoConfigurationClasses.length];
            for (int i = 0; i < autoConfigurationClasses.length; i++) {
                String autoConfigurationClass = autoConfigurationClasses[i];
                if (!filterClass.contains(autoConfigurationClass)) {
                    skip[i] = true;
                }
            }
            return skip;
        }

        return new boolean[0];
    }
}

功能代码说明:根据配置文件中的变量:spring.kafka.consumer.multiple-group得到的值是true还是false决定是否过滤掉com.elab.core.kafka.config.KafkaConsumerConfig类;

注意:在启动的时候引入它,在项目resouce文件新建META-INF文件夹在其中新建一个spring.factories类然后加入内容:

org.springframework.boot.autoconfigure.AutoConfigurationImportFilter=com.elab.data.route.config.KafkaAutoConfigurationImportFilter

启动的时候就会回调该类,基于类中定义的规则来决定是否加载SPI中默认引用的类了;

想要了解运行流程可以查看org.springframework.boot.autoconfigure.AutoConfigurationImportSelector#filter

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Spring Boot应用程序中配置XSS过滤器并返回结果,可以按照以下步骤操作: 1. 创建一个名为XSSFilter的并实现javax.servlet.Filter接口。 2. 在doFilter()方法中实现XSS过滤逻辑。 3. 在Spring Boot应用程序的配置中注册该过滤器。 以下是一个示例XSSFilter的代码: ``` import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class XSSFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { // Do nothing because there is no initialization needed for this filter } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest httpRequest = (HttpServletRequest) request; HttpServletResponse httpResponse = (HttpServletResponse) response; // Prevent XSS attacks XSSRequestWrapper wrappedRequest = new XSSRequestWrapper(httpRequest); chain.doFilter(wrappedRequest, httpResponse); } @Override public void destroy() { // Do nothing because there is no cleanup needed for this filter } } ``` 在上面的代码中,我们实现了XSSFilter并覆盖了init(), doFilter()和destroy()方法。在doFilter()方法中,我们使用XSSRequestWrapper对HttpServletRequest进行包装,以防止XSS攻击。接下来,我们需要在Spring Boot应用程序的配置中注册该过滤器: ``` import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class AppConfig { @Bean public FilterRegistrationBean<XSSFilter> xssFilterRegistrationBean() { FilterRegistrationBean<XSSFilter> registrationBean = new FilterRegistrationBean<>(); registrationBean.setFilter(new XSSFilter()); registrationBean.addUrlPatterns("/*"); return registrationBean; } } ``` 在上面的代码中,我们创建了一个名为AppConfig的配置,并使用@Bean注解注册了一个名为xssFilterRegistrationBean的过滤器注册bean。我们通过调用addUrlPatterns()方法将该过滤器应用于Spring Boot应用程序中的所有URL。现在,当Spring Boot应用程序处理请求时,XSS过滤器将自动应用于所有传入请求,以防止XSS攻击,并且响应将返回过滤后的结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值