注册同一类型的FilterRegistrationBean两次

注册同一类型的FilterRegistrationBean两次,filter,spring-boot,javabeans,Filter,Spring Boot,Javabeans,如何在spring boot FilterRegistrationBean中第二次注册相同类型的筛选器bean? 我有一个场景,我需要为不同的url模式注册两次相同类型的过滤器bean。假设IAMFilterBean类型的IAMFilterBean1是使用一个用于内部用户标识的身份验证密钥构建的。同一类型的IAMFilterBean的IAMFilterBean 2是使用不同的身份验证密钥构建的,用于外部用户标识。现在我需要用spring boot FilterRegistrationBean注册

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

我有一个场景,我需要为不同的url模式注册两次相同类型的过滤器bean。假设IAMFilterBean类型的IAMFilterBean1是使用一个用于内部用户标识的身份验证密钥构建的。同一类型的IAMFilterBean的IAMFilterBean 2是使用不同的身份验证密钥构建的,用于外部用户标识。现在我需要用spring boot 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;
}
@Bean
公共过滤器IAMPilterBean1(){
返回新的IamFilterBean(“验证密钥1”);
}
@豆子
公共过滤器IAMPilterBean2(){
返回新的IamFilterBean(“auth_key_2”);
}
@豆子
公共过滤器注册Bean过滤器注册(){
FilterRegistrationBean注册=新建FilterRegistrationBean();
registration.setFilter(iamFilterBean1());
注册。设置名称(“iamFilterBean1”);
List urlPatterns=newarraylist();
添加(“/api/internal/auth”);
注册.setUrlPatterns(urlPatterns);
申报登记;
}
@豆子
公共过滤器注册Bean过滤器注册(){
FilterRegistrationBean注册=新建FilterRegistrationBean();
registration.setFilter(iamFilterBean2());
注册。设置名称(“iamFilterBean2”);
List urlPatterns=newarraylist();
添加(“/api/external/auth”);
注册.setUrlPatterns(urlPatterns);
申报登记;
}

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

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

@Bean(name=“filterRegistrationBean2”)
公共过滤器注册Bean过滤器注册(){
FilterRegistrationBean注册=新建FilterRegistrationBean();
registration.setFilter(iamFilterBean2());
注册。设置名称(“iamFilterBean2”);
List urlPatterns=newarraylist();
添加(“/api/external/auth”);
注册.setUrlPatterns(urlPatterns);
申报登记;
}

您发布的代码无效。。。由于您有两个名为
filterRegistration
的bean,一个将覆盖另一个。发布实际代码,而不是虚构代码。接下来,您可能希望从过滤器中删除
@Bean
,因为它将在上下文中注册
过滤器,还检测到可能导致注册两次的错误。在命名过滤器Bean后,感谢您的宝贵建议@M.Deinum一切正常。不知何故,Bean注释中的name属性对我不起作用。但我已经将bean本身重命名为“filterRegistrationBean1”及其作品!谢谢
@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;
}