非Spring安全过滤器(例如addFilterAfter,addFilterBefore)的相对顺序?

时间:2019-02-01 08:20:18

标签: spring sorting spring-boot servlet-filters

我正在使用Spring Boot 2.0.4.RELEASE,并且有两个过滤器( java.servlet.Filter RequestHeaderParseFilterRequestLogFilterRequestHeaderParseFilter从请求标头中检索并设置值。然后RequestLogFilter记录它们。我已经使用FilterRegistrationBean

注册了它们
@Bean
public FilterRegistrationBean requestHeaderParseFilter () {
  FilterRegistrationBean registration = new FilterRegistrationBean();
  Filter requestHeaderParseFilter = new RequestHeaderParseFilter();
  this.beanFactory.autowireBean(requestHeaderParseFilter);
  registration.setFilter(requestHeaderParseFilter);
  registration.addUrlPatterns("/*");
  return registration;
}

@Bean
public FilterRegistrationBean requestLogFilter() {

  FilterRegistrationBean registration = new FilterRegistrationBean();
  Filter requestLogFilter = new RequestLogFilter();
  this.beanFactory.autowireBean(requestLogFilter);
  registration.setFilter(requestLogFilter);
  registration.addUrlPatterns("/rest/*");
  return registration;
}

我想在过滤器链中的RequestLogFilter之后订购RequestHeaderParseFilter。但是我不想使用RegistrationBean.setOrder(int)。在这种情况下,我有以下选择和问题:

  1. 我尝试使用Spring Security过滤器链中的addFilterAfter,如下所示

    @Inject
    @Qualifier("requestLogFilter")
    private FilterRegistrationBean<Filter> filterRegistrationBean;
    
    .addFilterAfter(this.filterRegistrationBean.getFilter(), RequestHeaderParseFilter.class);
    

    首先,这将引发错误Error creating bean with name 'springSecurityFilterChain'. Cannot register after unregistered Filter class。这意味着RequestHeaderParseFilter未在安全过滤器链中注册。

    Q1。 我需要在Spring Security过滤器链中显式注册我的过滤器吗?

    即使这可行,将这些过滤器添加到Spring Security过滤器链也感觉不直观,因为它们与安全性无关。

  2. 请勿将这些过滤器注册为Spring Security过滤器,而应注册为某些常规过滤器链的一部分。

    Q2。 除Spring Security过滤器链之外。春季还有其他过滤链可用吗?

    Q3。 我是否可以使用addFilterAfter之类的东西来订购我的过滤器,而无需使用Spring Security过滤器链?

0 个答案:

没有答案