网关过滤器

简介: 网关鉴权需在请求转发前完成。通过理解Gateway原理,利用GlobalFilter或GatewayFilter,在NettyRoutingFilter之前执行身份校验,实现安全控制。过滤器通过pre逻辑拦截请求,确保鉴权通过后才路由至微服务,保障系统安全。

网关鉴权必须在请求转发到微服务之前做,否则就失去了意义。而网关的请求转发是Gateway内部代码实现的,要想在请求转发之前做身份校验,就必须了解Gateway内部工作的基本原理。

  1. 客户端请求进入网关后由HandlerMapping对请求做判断,找到与当前请求匹配的路由规则(Route),然后将请求交给WebHandler去处理。
  2. WebHandler则会加载当前路由下需要执行的过滤器链(Filter chain),然后按照顺序逐一执行过滤器(后面称为Filter)。
  3. Filter内部的逻辑分为pre和post两部分,分别会在请求路由到微服务之前和之后被执行。
  4. 只有所有Filter的pre逻辑都依次顺序执行通过后,请求才会被路由到微服务。
  5. 微服务返回结果后,再倒序执行Filter的post逻辑。
  6. 最终把响应结果返回。
    最终请求转发是有一个名为NettyRoutingFilter的过滤器来执行的,而且这个过滤器是整个过滤器链中顺序最靠后的一个。如果我们能够定义一个过滤器,在其中实现身份校验逻辑,并且将过滤器执行顺序定义到NettyRoutingFilter之前,这就符合我们的需求了!
    那么,该如何实现一个网关过滤器呢?
    网关过滤器链中的过滤器有两种:
    ● GatewayFilter:路由过滤器,作用范围比较灵活,可以是任意指定的路由Route.
    ● GlobalFilter:全局过滤器,作用范围是所有路由,不可配置。
    其实GatewayFilter和GlobalFilter这两种过滤器的方法签名完全一致:
    /**
    • 处理请求并将其传递给下一个过滤器
    • @param exchange 当前请求的上下文,其中包含request、response等各种数据
    • @param chain 过滤器链,基于它向下传递请求
    • @return 根据返回值标记当前请求是否被完成或拦截,chain.filter(exchange)就放行了。
      */
      Mono filter(ServerWebExchange exchange, GatewayFilterChain chain);
      FilteringWebHandler在处理请求时,会将GlobalFilter装饰为GatewayFilter,然后放到过滤器链中,排序以后依次执行。
相关文章
|
2月前
|
人工智能 自然语言处理 安全
MCP的核心组件
MCP采用客户端-服务器架构,由MCP主机、客户端和服务器组成。主机承载AI智能体并发起请求;客户端负责请求标准化与安全通信;服务器提供数据、工具和提示,支持AI实时访问外部资源与服务,实现高效交互。
|
2月前
|
机器学习/深度学习 存储 人工智能
全球主流开源向量数据库
开源向量数据库凭借高效索引、相似性搜索、可扩展性及与机器学习框架的深度集成,正成为AI应用的核心基础设施。其活跃社区持续推动生态发展,广泛支持推荐系统、实时分析等场景,助力高维数据高效管理与智能应用落地。
|
2月前
|
机器学习/深度学习 存储 人工智能
大模型基础概念术语解释
大语言模型(LLM)基于Transformer架构,通过海量文本训练,具备强大语言理解与生成能力。其核心组件包括注意力机制、位置编码、嵌入层等,支持万亿级参数规模,展现出涌现与泛化特性。Token为基本处理单元,MoE架构提升效率。模型能力随规模扩大显著跃升,推动AI语言处理发展。
|
2月前
|
人工智能 安全
MCP是什么?为何被称为AI时代的“USB-C”
MCP(模型上下文协议)是AI领域的“通用接口”,像USB-C一样让大模型便捷连接数据源与工具。它通过标准化上下文传递,实现信息互通与任务协同,确保每次调用都具备数据血统、策略与出处管理,推动AI无缝交互与安全可控运行。
|
2月前
|
NoSQL MongoDB
集合的显式创建
MongoDB中使用`db.createCollection(name)`创建集合,name为集合名称,不可为空或含特殊字符如\0、$,且不能以"system."开头。创建后可用`show collections`或`show tables`查看当前库中的集合列表。
|
2月前
|
安全 API
SimpleDateFormat不要定义为static
SimpleDateFormat线程不安全,避免定义为static;若需静态使用,应加锁或采用ThreadLocal隔离。推荐JDK8新时间API:Instant、LocalDateTime、DateTimeFormatter,具备线程安全、简洁易用等优势。
|
2月前
|
SQL Java 数据库连接
Spring中的事务是如何实现的
Spring事务基于数据库事务与AOP实现,通过代理对象拦截加了@Transactional的方法,创建连接并禁用自动提交,方法执行后根据异常情况决定提交或回滚。事务隔离级别对应数据库级别,传播机制由Spring管理,基于数据库连接实现,复杂但灵活。
使用 entrySet 遍历 Map 类集合 KV
遍历Map时,entrySet效率高于keySet,因后者需两次遍历:转Iterator和查value,而entrySet一次将KV封装为entry。JDK8推荐使用Map.forEach。values()返回V集合,keySet()返回K集合,entrySet()返回KV组合集。
|
2月前
|
存储 Java C++
JVM 运行时数据区
Java虚拟机将内存划分为程序计数器、虚拟机栈、本地方法栈、堆和方法区。各区域职责分明:程序计数器记录线程执行位置;虚拟机栈管理方法调用的局部变量与操作数;本地方法栈服务Native方法;堆是对象实例的共享内存区;方法区存储类信息、常量、静态变量等。部分区域随JVM启动而存在,部分随线程创建销毁。