执行顺序(从小到大): 1.TRACE_ID_ORDER - 生成 TraceId (最高优先级) 2.BLACK_LIST_ORDER - 黑名单检查(尽早拦截) 3.REQUEST_CONTEXT_ORDER - 缓存请求体(为后续过滤器提供数据) 4.XSS_INJECTION_ORDER - XSS 注入检查 5.SQL_INJECTION_ORDER - SQL 注入检查 6.RATE_LIMITER_ORDER - 限流检查 7.API_LOG_ORDER - API 日志记录 8.AUTH_ORDER - Sa-Token 认证鉴权 9.JWT_BLACKLIST_ORDER - JWT 黑名单检查 10.FORWARD_AUTH_ORDER - 转发认证信息 11.业务处理 12.RESPONSE_CONTEXT_ORDER - 缓存响应体 13.REMOVE_CONTEXT_ORDER - 清理上下文(最低优先级)
Auth 是 WebFilter ( SaReactorFilter )”这一点决定了它一定会先于所有 GlobalFilter 执行。也就是说,按你写的序列把 Auth 放在第 8 位( TraceId 、黑名单、注入之后)是做不到的,除非把认证改造成 GlobalFilter (不走 SaReactorFilter )。所以:
如果保留 Sa-Token 的 SaReactorFilter (推荐做法),实际顺序一定是:WebFilter 阶段先认证,再进入 GlobalFilter 阶段做 TraceId/黑名单/注入/限流/日志等。 你给出的序列可作为 GlobalFilter 之间的相对顺序,但无法跨越 WebFilter 与 GlobalFilter 的边界 如果认证( Auth )放在最前面,未认证或非法请求可能直接被拦截,导致 API 日志和上下文处理没有执行 我这个 filter 顺序是否有问题,下面是整理的部分
| Filter | 类型 | 依赖 | 推荐 order |
|---|---|---|---|
| CORS | WebFilter | - | Integer.MIN_VALUE |
| Auth(Sa-Token) | WebFilter | - | -101 |
| Actuator | WebFilter | - | -100 (可选) |
| TraceId | GlobalFilter | 无 | Integer.MIN_VALUE |
| RequestContext | GlobalFilter | TraceId | Integer.MIN_VALUE+20 |
| Blacklist | GlobalFilter/WebFilter | 可依赖 Auth | Integer.MIN_VALUE+10(GlobalFilter) |
| XSS Injection | GlobalFilter | RequestContext | Integer.MIN_VALUE+30 |
| SQL Injection | GlobalFilter | RequestContext | Integer.MIN_VALUE+40 |
| Rate Limiter | GlobalFilter | RequestContext / IP | Integer.MIN_VALUE+50 |
| API Log | GlobalFilter | RequestContext | Integer.MIN_VALUE+60 |
| JWT Blacklist | GlobalFilter | Auth | -90 |
| Forward Auth | GlobalFilter | Auth | -80 |
| Business | 路由转发 | - | - |
| ResponseContext | GlobalFilter | RequestContext | WRITE_RESPONSE_FILTER_ORDER-1 |
| RemoveContext | GlobalFilter | 全局上下文 | Integer.MAX_VALUE |