有没有办法从 ApplicationFilterChain 获取所有 servlet 过滤器?

vBe*_*ean 5 java servlet-filters spring-boot

我有多个使用机制的定制 Java 库javax.servlet.Filter,我想确保集成这些库的开发人员不会使用 @Order(Ordered.HIGHEST_PRECEDENCE). 另外,如果你知道一种从他们的过滤器中
收集所有内容的方法,那就太棒了。 ApplicationFilterConfigApplicationFilterChainOrder

我认为当Spring初始化上下文时检查是否有多个具有最高优先级的过滤器,或者可能在注册过滤器时(如果有任何我可以实现或挂钩的SpringFilterResister)。

谢谢!

稍后编辑:由于我没有找到获取a 的
方法,所以我只是验证其他客户端是否尝试使用 注册a 。在展示代码之前,有两种方法将 Filter 注册到 Filter 链中: 1. 实现并注释 with (默认情况下具有最低优先级) 2.在类下使用 a。 话虽这么说,我只是检查是否有人使用这两种注册过滤器的方法: OrderFilterBeanOrdered.HIGHEST_PRECEDENCE
javax.servlet.Filter@Component
FilterRegistrationBean.class@Configuration

@ManagedBean
public class MyServletContextInitializer implements ServletContextInitializer {

    @Autowired
    private ApplicationContext context;

    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
        Map<String, ? extends FilterRegistration> filters = servletContext.getFilterRegistrations();

        //check for @Order(Ordered.HIGHEST_PRECEDENCE) annotations
        List<String> result = filters.keySet().stream()
                .filter(beanName -> context.getBean(beanName)
                        .getClass().getAnnotation(Order.class).value() == Ordered.HIGHEST_PRECEDENCE)
                .collect(Collectors.toList());


        if(result.size()>1) {
            throw new IllegalArgumentException("message");
        }

        //check for FilterRegistrationBean 
        if(context.getBean(FilterRegistrationBean.class).getOrder() == Ordered.HIGHEST_PRECEDENCE){
            throw new IllegalArgumentException("message");
        }
    }
}

Run Code Online (Sandbox Code Playgroud)

希望能帮助别人!干杯!