是否可以动态地在过滤器链中添加新过滤器?我的意思是通过检查条件/配置,我们可以在过滤器链中包含或排除特定过滤器吗?
答案 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方法中添加带条件的过滤器来过滤链。您将始终在链中使用此过滤器,但是当不满足条件时,过滤器将仅将控制权传递给下一个过滤器。