两次注册相同类型的FilterRegistrationBean

时间:2016-08-22 09:18:46

标签: filter spring-boot javabeans

如何在spring boot FilterRegistrationBean中第二次注册相同类型的过滤器bean?

我有一个场景,我需要为不同的url模式注册两次相同类型的过滤器bean。假设 IAMFilterBean 类型的 IAMFilterBean1 是使用一个auth密钥构建的,用于内部用户标识。并且使用不同的auth密钥为外部用户标识构建了相同类型 IAMFilterBean IAMFilterBean2 。现在我需要使用Spring引导FilterRegistrationBean注册这些IAMFilterBean1和IAMFilterBean2,以过滤不同的url模式!

我试过以下,

@Bean
public Filter iamFilterBean1() {
    return new IamFilterBean("auth_key_1");
}

@Bean
public Filter iamFilterBean2() {
    return new IamFilterBean("auth_key_2");
}

@Bean
public FilterRegistrationBean filterRegistration() {
    FilterRegistrationBean registration = new FilterRegistrationBean();
    registration.setFilter(iamFilterBean1());
    registration.setName("iamFilterBean1");

    List<String> urlPatterns = new ArrayList<>();
    urlPatterns.add("/api/internal/auth");
    registration.setUrlPatterns(urlPatterns);
    return registration;
}

@Bean
public FilterRegistrationBean filterRegistration() {
    FilterRegistrationBean registration = new FilterRegistrationBean();
    registration.setFilter(iamFilterBean2());
    registration.setName("iamFilterBean2");

    List<String> urlPatterns = new ArrayList<>();
    urlPatterns.add("/api/external/auth");
    registration.setUrlPatterns(urlPatterns);
    return registration;
}

但它对我不起作用!它过滤我的所有请求,而不仅仅是已定义的请求?你能帮我解决这个问题。

1 个答案:

答案 0 :(得分:6)

要注册一种类型的两个过滤器,您需要为它们命名(或至少命名一个):

@Bean(name="filterRegistrationBean2")
public FilterRegistrationBean filterRegistration() {
    FilterRegistrationBean registration = new FilterRegistrationBean();
    registration.setFilter(iamFilterBean2());
    registration.setName("iamFilterBean2");

    List<String> urlPatterns = new ArrayList<>();
    urlPatterns.add("/api/external/auth");
    registration.setUrlPatterns(urlPatterns);
    return registration;
}
相关问题