Java Spring-在运行时添加和删除过滤器



我有一个我想在运行时激活/停用的请求dumper过滤器(使用自定义执行器端点)。但是,如果不重新启动应用程序,我找不到方法。我目前的解决方案就是这样做的:

@Configuration
public class AppConfigs {
    @Value("${request.dumper.active:false}")
    private Boolean dumpActive;
    @Bean
    public FilterRegistrationBean requestDumperFilter() {
        FilterRegistrationBean registration = new FilterRegistrationBean();
        Filter requestDumperFilter = new RequestDumperFilter();
        registration.setFilter(requestDumperFilter);
        registration.addUrlPatterns("/*");
        registration.setEnabled(dumpActive);
        return registration;
    }

现在我想使用类似的东西:

@Component
public class RequestdumperEndpoint implements Endpoint<Boolean > {
    @Autowired
    private RequestDumperFilter requestDumperFilter;
    public String getId() {
        return "requestdumper";
    }
    public Boolean invoke() {
        return requestDumperFilter.isEnabled();
    }
    public Boolean setEnabled(Boolean enabled) {
        return requestDumperFilter.setEnabled(enabled);
    }

,但显然在过滤器上没有类别和设置的方法。

有什么想法我如何能够获得我需要的东西?

首先使用bean添加过滤器,以便您可以将其挂钩:

public class MyWebInitializer extends
        AbstractAnnotationConfigDispatcherServletInitializer {
    @Value("${request.dumper.active:false}")
    private Boolean dumpActive;
    @Bean
    private MyRequestDumperFilter myRequestDumperFilter() {
        MyRequestDumperFilter filter = new MyRequestDumperFilter();
        filter.setEnabled(dumpActive);
        return filter;
    }
    @Override
    protected String[] getServletMappings() {
        //..
        return new String[0];
    }
    @Override
    protected Filter[] getServletFilters() {
        return new Filter[]{myRequestDumperFilter()};
    }
    @Override
    protected Class<?>[] getRootConfigClasses() {
        //..
        return new Class<?>[0];
    }
    @Override
    protected Class<?>[] getServletConfigClasses() {
        //..
        return new Class<?>[0];
    }
}

您过滤会看起来像:

    public class MyRequestDumperFilter extends RequestDumperFilter{
        private Boolean enabled;
        public void setEnabled(Boolean enabled) {
            this.enabled = enabled;
        }
        public Boolean getEnabled() {
            return enabled;
        }
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
            if (enabled) {
                super.doFilter(request, response, chain);
            }
            else {
                chain.doFilter(request,response);
            }
        }
    }

最新更新