# 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`。