Java Spring — добавление и удаление фильтра во время выполнения

У меня есть фильтр дампера запросов, который я хочу активировать/деактивировать во время выполнения (используя пользовательскую конечную точку привода). Однако я не могу найти способ сделать это без перезапуска приложения. Мое текущее решение делает именно это:

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

Но очевидно, что в фильтре нет методов isEnabled и setEnabled.

Любые идеи, как я мог бы получить то, что мне нужно?


person Pete    schedule 10.03.2017    source источник
comment
что-то в похожих строках может помочь   -  person Bond - Java Bond    schedule 10.03.2017


Ответы (1)


Сначала добавьте свой фильтр, используя его как компонент, чтобы вы могли подключиться к нему:

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);
            }
        }
    }
person Essex Boy    schedule 10.03.2017