当前位置: 首页 > news >正文

微服务架构中过滤器(Filter)与拦截器(Interceptor)的区别

在微服务架构中,过滤器(Filter)拦截器(Interceptor) 是处理请求的两种核心机制,分别在网关层和服务层发挥重要作用。它们在功能、执行时机、作用范围等方面存在显著差异。本文以微服务为背景,梳理两者的区别,并结合典型场景进行说明。

一、定义与作用

  • 过滤器(Filter)
    • 基于 Servlet/Jakarta EE 规范,运行于 Web 容器(如 Tomcat、Jetty),位于 HTTP 请求进入 Servlet 前和响应返回客户端后。
    • 在微服务中,常用于网关层(如 Spring Cloud Gateway 或 Zuul)处理全局性、非业务逻辑,如日志记录、跨域处理(CORS)、统一认证等。
    • 示例:网关层记录所有请求的 IP 和路径,或验证 API Key。
  • 拦截器(Interceptor)
    • 基于 Spring 框架(如 Spring MVC),运行于 DispatcherServlet 内部,针对 Controller 请求进行拦截。
    • 在微服务中,主要用于具体服务内部处理业务逻辑,如用户权限验证、订单状态检查等。
    • 示例:订单服务中拦截请求以验证用户是否登录。

二、核心区别

以下从多个维度对比过滤器与拦截器在微服务中的特点:

1. 执行时机

  • 过滤器:在请求到达 DispatcherServlet 之前执行,优先级高于拦截器。
    • 微服务场景:网关层在请求进入具体服务前进行统一认证或日志记录。
  • 拦截器:在 DispatcherServlet 分发请求后、Controller 处理前后执行(分为 preHandle、postHandle、afterCompletion 三个阶段)。
    • 微服务场景:在用户服务中,拦截器在 Controller 处理前验证用户角色。

2. 作用范围

  • 过滤器:作用于所有进入 Web 容器的请求,包括静态资源(CSS、JS)和非 Spring 管理的 Servlet 请求。
    • 微服务场景:网关层处理所有流量,如为所有请求添加追踪 ID(X-Request-ID)。
  • 拦截器:仅作用于 Spring MVC 管理的 Controller 请求,无法处理静态资源或非 Spring 请求。
    • 微服务场景:在支付服务中仅拦截支付相关的 API 请求。

3. 配置方式

  • 过滤器
    • 通过 web.xml@WebFilter 注解配置,运行于 Servlet 容器。
    • 示例代码(网关层日志过滤器):
      @WebFilter(urlPatterns = "/*")
      public class LoggingFilter implements Filter {@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {System.out.println("Filter: Request URL = " + ((HttpServletRequest) request).getRequestURI());chain.doFilter(request, response);}
      }
      
  • 拦截器
    • 通过 Spring 配置类或 @Component 注解注入到 Spring MVC。
    • 示例代码(订单服务权限拦截器):
      @Component
      public class AuthInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {String token = request.getHeader("Authorization");if (token == null) {response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);return false;}return true;}
      }
      

4. 依赖性

  • 过滤器:依赖 Servlet 容器,与框架无关,适用于网关层或跨框架场景。
    • 微服务场景:Spring Cloud Gateway 中使用 Servlet Filter 处理全局请求。
  • 拦截器:依赖 Spring 框架,深度集成 Spring 上下文,可直接访问 Spring Bean(如 Service、Repository)。
    • 微服务场景:在用户服务中通过拦截器调用 UserService 验证用户权限。

5. 功能特性

  • 过滤器
    • 可修改请求/响应对象(如包装 HttpServletRequest 修改参数)。
    • 微服务场景:网关层为所有请求添加认证头或设置 CORS 响应头。
  • 拦截器
    • 提供更细粒度的控制,支持 preHandle(前置)、postHandle(后置)、afterCompletion(完成)三个阶段,可操作 ModelAndView。
    • 微服务场景:在订单服务中拦截器修改 Controller 返回的订单数据。

6. 执行顺序

  • 过滤器:按配置顺序在 Servlet 容器中执行,先于拦截器。
    • 微服务场景:网关层的过滤器先验证 Token,再由服务层拦截器检查业务逻辑。
  • 拦截器:按 Spring 配置顺序在 DispatcherServlet 内执行,晚于过滤器。
    • 微服务场景:订单服务中多个拦截器按顺序检查用户身份和订单状态。

三、微服务中的典型场景

在微服务架构中,过滤器和拦截器分层使用,分别在网关层和服务层发挥作用:

  • 过滤器(网关层)
    • 统一认证:在网关层验证 JWT Token 或 OAuth2 令牌。
    • 日志记录:记录所有请求的元信息(如请求时间、路径、IP)。
    • 跨域处理:为所有服务统一设置 CORS 响应头。
    • 请求过滤:拦截恶意请求(如 SQL 注入、XSS 攻击)。
  • 拦截器(服务层)
    • 业务权限:在用户服务中验证用户是否有权限访问某个 API。
    • 业务日志:记录订单服务中创建订单的具体参数和结果。
    • 性能监控:统计支付服务中 Controller 方法的执行时间。
    • 数据校验:在库存服务中拦截请求,验证库存是否充足。

四、结合 GlobalFilter 的说明

在 Spring Cloud Gateway 中,GlobalFilter 是一种特殊的过滤器,作用于网关层所有路由,类似于 Servlet Filter,但基于 WebFlux 的响应式编程模型。相比之下:

  • GlobalFilter:全局作用于网关所有请求,支持异步处理,常用于限流、认证、请求重写。
  • Filter:传统 Servlet 过滤器,同步处理,适用于网关或单体服务。
  • Interceptor:服务内部的 Spring MVC 机制,专注于业务逻辑。

示例(GlobalFilter)

@Component
public class LoggingGlobalFilter implements GlobalFilter, Ordered {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {System.out.println("GlobalFilter: Request path = " + exchange.getRequest().getPath());return chain.filter(exchange);}@Overridepublic int getOrder() {return -1; // 优先级}
}

五、总结

  • 过滤器(Filter):适用于微服务网关层,处理全局性、非业务逻辑(如认证、CORS),运行于 Servlet 容器,作用范围广,适合跨服务统一处理。
  • 拦截器(Interceptor):适用于具体微服务内部,处理业务逻辑(如权限校验、数据处理),运行于 Spring MVC,灵活性高,深度集成 Spring 上下文。
  • 在微服务架构中,过滤器拦截器 结合使用:网关层通过过滤器(或 GlobalFilter)处理全局逻辑,服务层通过拦截器处理特定业务逻辑,形成分层处理机制。
http://www.dtcms.com/a/325093.html

相关文章:

  • 线程池111
  • Spring Boot - 内置的9个过滤器用法
  • 串联所有单词的子串
  • 【力扣198】打家劫舍
  • Windows选择文件自动删除及输入框自动打字的解决办法
  • 当varchar和Nvarchar关联
  • 6A 工作流:让 Cursor、Trae 等AI编程助手按流程交付的实战手册
  • Java 基础编程案例:从输入交互到逻辑处理
  • 基于django的宠物用品购物商城的设计与实现
  • [创业之路-540]:经营分析会 - 如何实现销售0到1营收的突破
  • 从DDPM对比学习Diffusion Policy:生成模型到策略学习的演进
  • Spring Boot 开发三板斧:POM 依赖、注解与配置管理
  • 字节:计算机存储单位
  • 计算机视觉实战:用YOLO打造智能停车场空位雷达
  • 线程互斥与锁机制详解
  • 【模板】拓扑排序
  • 性能解析案例
  • 人工智能与体育:体育产业的革新
  • Vue3从入门到精通: 2.5 Vue3组件库开发与设计系统构建
  • Python day40
  • Leetcode 3645. Maximum Total from Optimal Activation Order
  • vulnhub-drippingblues靶场攻略
  • VTA学习笔记
  • 实现MATLAB2024b和M文件关联(防止运行多个MATLAB)
  • iptables -F 与 iptables -X
  • GNN训练:本地训练数据准备
  • scikit-learn/sklearn学习|线性回归解读
  • 虚拟机安装ubuntu系统
  • C++多线程服务器
  • MySQL基础知识总结