是否可以动态地在过滤器链中添加新的过滤器?我的意思是检查条件/配置,我们可以包括或从过滤器链中排除特定过滤器吗?
我认为在常规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。