ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

SpringGateway、Servlet‑Tomcat、SpringSecurity(一)

SpringGateway、Servlet‑Tomcat、SpringSecurity(一) SpringCloud Gateway基于过滤器 (Filter)不是 Servlet 的拦截器 (Interceptor)一句话总结 Spring‑Cloud‑Gateway 底层基于Spring WebFlux(Reactor‑Netty)没有 Servlet 容器也就没有 Servlet 的 HandlerInterceptor 拦截器整套链路使用 GatewayFilter GlobalFilter网关过滤器。1、先分清几个概念① Servlet 的 HandlerInterceptor拦截器属于SpringMVC(Servlet)体系运行在 Tomcat/Jetty Servlet 容器。作用在 Controller 方法前后拦截请求。❌ Gateway 是 WebFlux 响应式完全不使用 Servlet所以根本用不到 HandlerInterceptor。② Gateway 的两类过滤器核心Gateway 里面分两层过滤器1. GatewayFilter局部过滤器绑定到某一个路由上只对当前这条路由生效。在 yml 配置里filters:下面配置的就是它。spring: cloud: gateway: routes: - id: demo uri: http://localhost:8081 predicates: - Path/demo/** filters: - AddRequestHeaderX‑Test,hello # GatewayFilter局部过滤器2. GlobalFilter全局过滤器对所有路由全部生效一般写 Java 代码实现不能 yml 直接配置。自定义实现GlobalFilter接口。Component public class MyGlobalFilter implements GlobalFilter, Ordered { Override public MonoVoid filter(ServerWebExchange exchange, GatewayFilterChain chain) { // pre转发到后端服务之前执行 System.out.println(网关前置逻辑); return chain.filter(exchange) .then(Mono.fromRunnable(() - { // post后端返回响应之后执行 System.out.println(网关后置逻辑); })); } Override public int getOrder() { return -1; } }2、过滤器执行顺序pre /postGatewayFilterChain 过滤器链pre 阶段顺序按 order 从小到大执行请求转发下游服务之前网关把请求转发给后端微服务post 阶段顺序反过来order 从大到小执行拿到后端响应回来之后order 越小优先级越高pre 正向post 逆向。3、还有一个WebFilterorg.springframework.web.server.WebFilter⚠️ 注意区分WebFilter和GlobalFilterWebFilterSpring WebFlux 顶层的 web 过滤器相当于 Servlet 的Filter在网关路由逻辑之前就执行属于 WebFlux 原生组件。GlobalFilterGateway 框架封装出来的过滤器网关路由匹配成功之后才进入的过滤链。执行先后顺序WebFilter(WebFlux原生)→ Gateway 路由匹配 →GlobalFilter GatewayFilter组成网关过滤链 → 转发后端服务4、对比总结表组件所属体系适用 Gateway说明HandlerInterceptorSpringMVC‑Servlet❌不可用Servlet 拦截器WebFlux 没有这套东西javax.servlet.FilterServlet❌不可用Servlet 过滤器Gateway 非 servlet 环境无效org.springframework.web.server.WebFilterSpring WebFlux✅可用WebFlux 原生 web 过滤器网关外层GlobalFilterSpringCloudGateway✅全局网关内部全局过滤器路由匹配后执行GatewayFilterSpringCloudGateway✅路由局部绑定单个路由的过滤器可以配置文件写5、开发选型建议如果你是做网关层鉴权、日志、改写请求头优先自定义GlobalFilter如果只想针对某一条路由做特殊处理写自定义GatewayFilterFactory不要尝试用 HandlerInterceptor网关根本不走 MVC 这套写了不会生效WebFilter适合做网关最外层的处理早于路由匹配例如 CORS 跨域。补充很多人混淆拦截器和过滤器本质根源 Servlet 栈Filter(先) → Interceptor(后) → ControllerWebFlux‑Gateway 栈WebFilter(先) → Gateway(GlobalFilterGatewayFilter) → 后端服务
返回列表