Spring如何查看非安全类过滤器顺序及全部注册过滤器链
Spring全量过滤器链查询方案
方法1:从Spring容器获取所有Filter Bean及执行顺序
Spring管理的所有过滤器(包含安全类、非安全类)都会以Bean形式存储在ApplicationContext中,可直接按类型批量获取,同时读取Ordered接口或@Order注解值拿到排序规则:
- 代码示例:
import org.springframework.context.ApplicationContext; import org.springframework.core.Ordered; import org.springframework.core.annotation.Order; import javax.servlet.Filter; import java.util.Map; import java.util.stream.Collectors; // 先注入ApplicationContext实例 private final ApplicationContext applicationContext; public void listAllFiltersWithOrder() { // 获取所有Filter类型的Bean Map<String, Filter> allFilterBeans = applicationContext.getBeansOfType(Filter.class); // 按执行顺序升序排列 var sortedFilters = allFilterBeans.values().stream() .sorted((f1, f2) -> Integer.compare(getFilterOrder(f1), getFilterOrder(f2))) .collect(Collectors.toList()); // 输出结果 sortedFilters.forEach(filter -> { System.out.printf("过滤器类名:%s,排序优先级:%d%n", filter.getClass().getSimpleName(), getFilterOrder(filter)); }); } // 读取过滤器排序值 private int getFilterOrder(Filter filter) { if (filter instanceof Ordered) { return ((Ordered) filter).getOrder(); } Order orderAnno = filter.getClass().getAnnotation(Order.class); return orderAnno != null ? orderAnno.value() : Ordered.LOWEST_PRECEDENCE; }
该方法拿到的过滤器排序和实际请求执行顺序完全一致,覆盖所有Spring管理的过滤器实例。
方法2:从Servlet上下文获取注册的过滤器
如果需要包含非Spring管理的、直接注册到Servlet容器的过滤器,可通过ServletContext的API获取:
- 代码示例:
import javax.servlet.ServletContext; // 先注入ServletContext实例 private final ServletContext servletContext; public void listAllServletFilters() { var filterRegs = servletContext.getFilterRegistrations(); filterRegs.forEach((filterName, registration) -> { System.out.printf("过滤器注册名:%s,实现类:%s,匹配路径:%s%n", filterName, registration.getClassName(), registration.getUrlPatternMappings()); }); }
补充说明
FilterChainProxy是Spring Security专属的过滤器组件,仅维护安全类过滤器链的相关信息,本身不承载非安全类过滤器的数据,因此无法通过它的接口获取全量过滤器信息。
内容的提问来源于stack exchange,提问作者hello2244
相关产品推荐
相关产品推荐

