You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 17:54:03