Pete
Pete

Reputation: 10918

Java Spring - Add and remove Filter at runtime

I have a request dumper filter that I want to activate/deactivate at runtime (using a custom actuator endpoint). However I cannot find a way to do so without restarting the app. My current solution does just that:

@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;
    }

Now I want to use something like that:

@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);
    }

But obviously there are not isEnabled and setEnabled methods on a Filter.

Any ideas how I might be able to get what I need?

Upvotes: 0

Views: 3388

Answers (1)

Essex Boy
Essex Boy

Reputation: 7950

First add your filter using as a bean so you can hook into it:

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];
    }
}

You filter will then look something like :

    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);
            }
        }
    }

Upvotes: 1

Related Questions