# filter **Repository Path**: zjw2018/filter ## Basic Information - **Project Name**: filter - **Description**: No description available - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-07-17 - **Last Updated**: 2026-07-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # filter 从 Spring Framework / Spring Security 中抽取的过滤器链骨架(Servlet + WebFlux),类名与官方刻意区分,可独立引入、不依赖完整 `spring-security-*` 栈。 **参考版本(源码对照移植):** | 项目 | 版本 | |---|---| | Spring Security | **7.0.5**(`spring-security-web` 等) | | Spring Framework | **7.0.8** | | Spring Boot | **4.0.7**(starter / 示例) | 上述版本与父 POM 属性 `spring-security.version` / `spring.version` / `spring-boot.version` 一致。 ## 模块 | 模块 | 说明 | |---|---| | `filter-context` | `FilterContext` / `FilterContextHolder`(无 Reactor 依赖;Servlet / WebFlux 共享) | | `filter-servlet` | Servlet 核心实现(含 `RequestIdFilter`、`FilterContextHolderFilter` 等),依赖 `jakarta.servlet-api`(provided) | | `filter-spring` | Spring 桥接 + `HttpFilterChainBuilder` DSL(类比 `HttpSecurity`) | | `filter-spring-boot-starter` | Servlet 自动配置:prototype builder、收集 `MatchedFilterChain`、组装 `FilterChainRouter`、注册 `DelegateFilterProxy` | | `filter-webflux` | WebFlux 核心(含 `RequestIdWebFilter`)+ `ServerHttpFilterChainBuilder` DSL(类比 `ServerHttpSecurity`) | | `filter-webflux-spring-boot-starter` | Reactive 自动配置:prototype builder、收集 `MatchedWebFilterChain`、注册 `WebFilterChainRouter` | | `example-filter` | Spring Boot Servlet 完整示例(不发布到 Maven Central) | | `example-reactive-filter` | Spring Boot WebFlux 完整示例(不发布到 Maven Central) | ### Spring Boot 用法 ```xml io.gitee.gzcltech.filter filter-spring-boot-starter ${filter.version} ``` 注入 prototype `HttpFilterChainBuilder`(类比 `HttpSecurity`)声明链,starter 自动挂到容器: ```java @Bean @Order(1) MatchedFilterChain apiChain(HttpFilterChainBuilder http) { return http .securityMatcher("/api/**") .addFilter(new RequestIdFilter()) .addFilterAfter(new LoggingFilter(), RequestIdFilter.class) .build(); } ``` 仍可直接返回 `DefaultMatchedFilterChain`。配置前缀:`gzcltech.filter.*`(`enabled` / `filter-name` / `url-patterns` / `order`)。 `HttpFilterChainBuilder.build()` 默认按 `FilterOrderRegistration` 自动加入 `FilterContextHolderFilter`(可用 `http.disableFilterContextHolder()` 关闭)。 可选显式加入(互斥于 Holder 的自动 save 语义): ```java .addFilter(new FilterContextPersistenceFilter(repository)) // 请求结束自动 save+clear;勿与 Holder 同链 .addFilter(HeaderWriterFilter.defaults()) .addFilter(new io.gitee.gzcltech.filter.web.cors.CorsFilter(corsConfigurationSource)) // filter-spring ``` 默认 order:`RequestId(100)` → `FilterContextHolder`/`FilterContextPersistence(200)` → `HeaderWriter(300)` → `Cors(400)`。 详见 [`example-filter/README.md`](example-filter/README.md): ```bash mvn -pl example-filter -am spring-boot:run ``` ### Spring Boot WebFlux 用法 ```xml io.gitee.gzcltech.filter filter-webflux-spring-boot-starter ${filter.version} ``` 注入 prototype `ServerHttpFilterChainBuilder`(类比 `ServerHttpSecurity`): ```java @Bean @Order(1) MatchedWebFilterChain apiChain(ServerHttpFilterChainBuilder http) { return http .securityMatcher("/api/**") .addFilterAt(requestId, SecurityWebFiltersOrder.REQUEST_ID) .addFilterAfter(logging, SecurityWebFiltersOrder.REQUEST_ID) .build(); } ``` 配置前缀:`gzcltech.filter.webflux.*`(`enabled` / `order`)。 `ServerHttpFilterChainBuilder.build()` 默认在 `REACTOR_CONTEXT` 槽位自动加入 `FilterContextReactorWebFilter`(可用 `http.disableFilterContextReactor()` 关闭)。 可选显式加入: ```java .addFilterAt(new FilterContextPersistenceWebFilter(repo), SecurityWebFiltersOrder.REACTOR_CONTEXT) // 勿与 Reactor 同链 .addFilterAt(HttpHeaderWriterWebFilter.defaults(), SecurityWebFiltersOrder.HTTP_HEADERS_WRITER) .addFilterAt(new CorsWebFilter(corsSource), SecurityWebFiltersOrder.CORS) ``` 详见 [`example-reactive-filter/README.md`](example-reactive-filter/README.md): ```bash mvn -pl example-reactive-filter -am spring-boot:run ``` ## Maven 坐标 ```xml io.gitee.gzcltech.filter filter-servlet ${filter.version} io.gitee.gzcltech.filter filter-spring ${filter.version} io.gitee.gzcltech.filter filter-webflux ${filter.version} ``` ## 与 Spring 官方命名对照 | Spring / Spring Security | 本库 | |---|---| | `SecurityFilterChain` | `MatchedFilterChain` | | `DefaultSecurityFilterChain` | `DefaultMatchedFilterChain` | | `FilterChainProxy` | `FilterChainRouter` | | `DelegatingFilterProxy` | `DelegateFilterProxy` | | `GenericFilterBean` | `ConfigurableFilter` | | `FilterOrderRegistration` | `FilterOrderRegistration`(公开 API;默认仅注册本库 Filter) | | `HttpSecurity` | `HttpFilterChainBuilder` | | `SecurityWebFiltersOrder` | `SecurityWebFiltersOrder`(`FIRST` / `REQUEST_ID` / `REACTOR_CONTEXT` / `HTTP_HEADERS_WRITER` / `CORS` / `LAST`) | | `ServerHttpSecurity` | `ServerHttpFilterChainBuilder` | | `SecurityWebFilterChain` | `MatchedWebFilterChain` | | `MatcherSecurityWebFilterChain` | `DefaultMatchedWebFilterChain` | | `WebFilterChainProxy` | `WebFilterChainRouter` | | `SecurityContext` / `SecurityContextHolder` | `FilterContext` / `FilterContextHolder`(`filter-context`;支持 `MODE_THREADLOCAL` / `MODE_INHERITABLETHREADLOCAL`) | | `DelegatingSecurityContextRunnable` / `Executor` | `DelegatingFilterContextRunnable` / `DelegatingFilterContextExecutor` | | `ReactiveSecurityContextHolder` | `ReactiveFilterContextHolder`(`filter-webflux`) | | `SecurityContextHolderFilter` | `FilterContextHolderFilter` | | `SecurityContextPersistenceFilter` | `FilterContextPersistenceFilter`(行为壳;复用 `FilterContextRepository`) | | `HeaderWriterFilter` / `HeaderWriter` | `HeaderWriterFilter` / `HeaderWriter`(含常用 Writer + `defaults()`) | | `org.springframework.web.filter.CorsFilter` | `io.gitee.gzcltech.filter.web.cors.CorsFilter`(`filter-spring`,委托官方实现) | | `HttpHeaderWriterWebFilter` / `ServerHttpHeadersWriter` | `HttpHeaderWriterWebFilter` / `ServerHttpHeadersWriter`(`filter-webflux`,含 `defaults()`) | | WebFlux Persistence 行为壳 | `FilterContextPersistenceWebFilter`(复用 `ServerFilterContextRepository`;与 `FilterContextReactorWebFilter` 互斥) | | `org.springframework.web.cors.reactive.CorsWebFilter` | `io.gitee.gzcltech.filter.webflux.cors.CorsWebFilter` | | `ReactorContextWebFilter` | `FilterContextReactorWebFilter` | | `SecurityContextServerWebExchangeWebFilter` | `FilterContextServerWebExchangeWebFilter` | | `ServerWebExchangeMatcher` 族 | `ServerWebExchangeMatcher` 族(保留) | | `ServerWebExchangeFirewall` / `StrictServerWebExchangeFirewall` | 同名保留(`firewall` 包) | **注意:** 包名为 `io.gitee.gzcltech.filter.*`,与官方 `org.springframework.*` 不同。请勿与官方 Spring / Spring Security jar 混用同名 import,避免类冲突与行为混淆。 ## 最小用法(Servlet) 组装过滤器链,放入 `ServletContext`,再通过 `DelegateFilterProxy` 挂到容器: ```java import io.gitee.gzcltech.filter.web.DefaultMatchedFilterChain; import io.gitee.gzcltech.filter.web.FilterChainRouter; import io.gitee.gzcltech.filter.web.util.matcher.AntPathRequestMatcher; import jakarta.servlet.Filter; FilterChainRouter router = new FilterChainRouter(List.of( new DefaultMatchedFilterChain( new AntPathRequestMatcher("/**"), List.of(myFilter)))); servletContext.setAttribute("springMatchedFilterChain", router); // web.xml 或 ServletRegistration 注册 DelegateFilterProxy,filter-name=springMatchedFilterChain ``` `DelegateFilterProxy` 默认通过 `ServletContextFilterDelegateFactory` 按 filter-name 从 `ServletContext` attribute 解析委托 Filter。Spring 环境可引入 `filter-spring`,使用 `WebApplicationContextFilterDelegateFactory` 按 bean name 解析。 ## 许可 Apache License 2.0。部分代码改编自 **Spring Security 7.0.5** / Spring Framework 7.0.8;来源说明见各源文件顶部版权声明及 `resources/META-INF/NOTICE.txt`。