2017-03-10 30 views
0

我有一个要求在运行时激活/停用(使用自定义执行器端点)的转储筛选器。但是我无法找到一种方法来重新启动应用程序。我目前的解决方案做到了这一点: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并在过滤器的方法。

任何想法如何能够得到我需要的东西?

+0

上的东西[类似线(HTTP:/ /stackoverflow.com/a/6856036/1910582)可以有所帮助 –

回答

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