动态添加新过滤器

时间:2017-06-06 13:50:54

标签: java web-services java-ee

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

4 个答案:

答案 0 :(得分:1)

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

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

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

E.g。在这个问题中描述了如何以编程方式声明servlet Map servlet programmatically instead of using web.xml or annotations

如果你使用Spring框架,你也可以考虑使用spring的回调来做到这一点。查看此文章How to specify url-pattern for Servlet filters in WebApplicationInitializer?

答案 1 :(得分:1)

这次spring和@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。

答案 2 :(得分:1)

我使用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);
            }
        };
    }

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

答案 3 :(得分:0)

我认为这种要求的简单解决方案是在doFilter方法中添加带条件的过滤器来过滤链。您将始终在链中使用此过滤器,但是当不满足条件时,过滤器将仅将控制权传递给下一个过滤器。