vBe*_*ean 5 java servlet-filters spring-boot
我有多个使用机制的定制 Java 库javax.servlet.Filter
,我想确保集成这些库的开发人员不会使用 @Order(Ordered.HIGHEST_PRECEDENCE)
. 另外,如果你知道一种从他们的过滤器中
收集所有内容的方法,那就太棒了。 ApplicationFilterConfig
ApplicationFilterChain
Order
我认为当Spring初始化上下文时检查是否有多个具有最高优先级的过滤器,或者可能在注册过滤器时(如果有任何我可以实现或挂钩的SpringFilterResister)。
谢谢!
稍后编辑:由于我没有找到获取a 的
方法,所以我只是验证其他客户端是否尝试使用 注册a 。在展示代码之前,有两种方法将 Filter 注册到 Filter 链中:
1. 实现并注释 with (默认情况下具有最低优先级)
2.在类下使用 a。
话虽这么说,我只是检查是否有人使用这两种注册过滤器的方法: Order
Filter
Bean
Ordered.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)
希望能帮助别人!干杯!
归档时间: |
|
查看次数: |
2170 次 |
最近记录: |