动态添加一个新的过滤器



是否可以动态地在过滤器链中添加新的过滤器?我的意思是检查条件/配置,我们可以包括或从过滤器链中排除特定过滤器吗?

我认为在常规web.xml文件中不可能。

您可以考虑使用ServletContainerInitializer。这是一种编程方式声明您的Web应用程序配置的方法。

这意味着您可以通过编程方式设置可以在常规web.xml中定义的servlet,过滤器和其他内容。

例如。在这个问题中,描述了如何以编程方式声明servlet,以编程映射servlet,而不是使用web.xml或注释

如果您使用弹簧框架,也可以考虑使用弹簧的回调来做到这一点。检查本文如何在WebApplicationInitializer中指定url-Pattern?

我使用CompositeFilter做了这样的事情。

 private Filter ssoFilter() {
        return new GenericFilter() {
            @Override
            public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
                List<Filter> identityProviderFilters = identityProviderFilterProvider.getAllIdentityProviderFilters();
                CompositeFilter filter = new CompositeFilter();
                filter.setFilters(identityProviderFilters);
                filter.doFilter(request, response, chain);
            }
        };
    }

根据数据库条目确定过滤器的位置。

我相信,对于这种要求,简单的解决方案是在dofilter方法中添加过滤器中的过滤器以滤链链。您将始终将此过滤器在链中,但是当不满足条件时,过滤器只会将控件传递到下一个过滤器。

这段时间spring and @conditionalonexpression注释可以帮助我根据配置加载过滤器bean。

我遵循的步骤

在我的配置类(具有@configuration的类(

上定义bean

使用@conditionalonexpression动态加载bean(基于配置文件(

请参阅以下代码段

  @Bean
        @ConditionalOnExpression("#{environment.getProperty('security.oauth2.custom.filters').contains('XTokenFilter')}")
        public FilterRegistrationBean xxTokenFilter() {
            FilterRegistrationBean registrationBean = new FilterRegistrationBean();
            XTokenFilter xTokenFilter = new XTokenFilter();
            xTokenFilter.setAuthenticationManager(XOuthenticationManager());
            beanFactory.autowireBean(xTokenFilter );

    registrationBean.setFilter(xTokenFilter);
            registrationBean.setOrder(findOrderOfCustomFilters("XTokenFilter"));
            return registrationBean;
        }

当属性" security.oauth2.custom.filters"包含值xtokenfilter。

时,此bean才会加载。

相关内容

  • 没有找到相关文章

最新更新