在Spring Cloud(Gateway)中,GlobalFilter 和 HandlerInterceptor 不存在直接的执行顺序比较,因为它们位于请求链路中完全不同的层级和时间点。
GlobalFilter 在 API网关层 执行,而 HandlerInterceptor 在请求到达后端微服务后,于Spring MVC框架内执行。
⏳ 完整请求链路中的执行顺序
一个请求从客户端到后端服务,其完整的执行顺序如下:
客户端 发起请求
API网关层 (Spring Cloud Gateway)
GlobalFilter (前置逻辑): 按 Order 值从小到大执行。
GatewayFilter (路由过滤器, 前置逻辑): 与 GlobalFilter 合并排序后执行。
路由转发: 请求被转发到目标微服务。
GatewayFilter (后置逻辑): 按 Order 值从大到小执行。
GlobalFilter (后置逻辑): 按 Order 值从大到小执行。
后端微服务 (Spring Boot)
Servlet Filter: 标准的Servlet过滤器。
HandlerInterceptor.preHandle(): 在Controller方法执行之前执行。
Controller / 业务逻辑
HandlerInterceptor.postHandle(): 在Controller方法执行之后,视图渲染之前执行。
HandlerInterceptor.afterCompletion(): 在请求完全结束后执行。
响应 返回给客户端
🎯 GlobalFilter 的执行顺序(网关层)
GlobalFilter 的执行顺序由 Ordered 接口的 getOrder() 方法决定,数值越小,优先级越高。
pre 阶段(请求前): Order 值越小,越先执行。
post 阶段(响应后): Order 值越小,越后执行。
Order值相同时的规则
当多个过滤器的 Order 值相同时:
同为 GlobalFilter: 执行顺序可能取决于类文件的加载顺序,不确定。
GlobalFilter vs GatewayFilter: GlobalFilter 会优先执行。
🎯 HandlerInterceptor 的执行顺序(微服务层)
HandlerInterceptor 的执行顺序由注册时的顺序决定。
preHandle(): 按照注册的顺序执行。
postHandle() 和 afterCompletion(): 按照注册的逆序执行。
💎 总结
简单来说,GlobalFilter 在网关层面拦截,HandlerInterceptor 在微服务内部拦截。理解它们在整个请求链路中的不同位置,有助于你更准确地设计全局性的鉴权、日志或路由策略。