网关全局过滤器:Java中的强大工具

简介: 网关全局过滤器:Java中的强大工具

网关过滤器简介


网关过滤器是一个位于应用程序和底层服务之间的组件,它截取进出网络请求,并提供对请求和响应进行处理的机制。它可以在请求到达目标服务之前或响应返回给客户端之前拦截、修改或增强它们。


网关提供了31种,但每一种过滤器的作用都是固定的。**如果我们希望拦截请求,做自己的业务逻辑则没办法实现。这就引出了我们的Spring Gateway全局过滤器。**他可以实现过滤请求的时候按照自己的自己的业务逻辑进行路由的处理。

Gateway网关的过滤器分为两种,一种是局部过滤器,一种是全局过滤器。

在这里,全局过滤器的作用是处理一切进入网关的请求和微服务响应,GlobalFilter的逻辑需要自己写代码实现。


网关过滤器的作用


网关过滤器具有广泛的应用场景,包括但不限于以下方面:


安全性:通过身份验证、加密和防火墙等机制来保护应用程序和数据的安全。

访问控制:控制用户对资源的访问权限,确保只有经过授权的用户可以访问敏感信息。

缓存:缓存响应以减少对底层服务的请求次数,提高性能。

日志记录:记录请求和响应的详细信息,用于故障排除和监控。

负载均衡:将请求分发到多个后端服务,以提高可用性和吞吐量。


过滤器的生命周期


过滤器在 Java Servlet 规范中定义了其生命周期,生命周期涵盖了过滤器的创建、初始化、请求处理和销毁等不同阶段。下面从多个角度描述过滤器的生命周期。


创建和加载阶段:

在应用程序启动时,Web 容器会加载过滤器并创建其实例。过滤器的创建是由容器负责的,它会在需要的时候实例化过滤器对象。


初始化阶段:

过滤器在创建后会进行初始化操作。在过滤器初始化阶段,可以执行一些预备工作,如读取配置参数、建立数据库连接等。过滤器可以通过重写 init() 方法来实现自定义的初始化逻辑。该方法会在过滤器创建后立即调用一次。


请求处理阶段:

过滤器的主要功能是在请求到达目标资源之前或之后进行拦截和处理。在请求处理阶段,过滤器会拦截请求并执行自定义的逻辑,如身份验证、请求修改、日志记录等。过滤器通过实现 doFilter() 方法来定义自己的处理逻辑。在调用 doFilter() 方法之前,容器会首先调用过滤器的 init() 方法进行初始化。


过滤器链:

在请求处理阶段,如果应用程序中有多个过滤器,它们会形成一个过滤器链。过滤器链的顺序由过滤器在部署描述符中的配置顺序决定。每个过滤器都可以选择将请求传递给下一个过滤器或目标资源,或者在需要时中断请求链的传递。过滤器链的执行顺序是按照配置中的顺序依次执行的。


请求处理完成和响应返回阶段:

在过滤器链中的过滤器都完成了它们的处理逻辑后,请求会到达目标资源(例如 Servlet 或 JSP)。目标资源执行完毕后,响应会返回给过滤器链。此时,过滤器链中的过滤器可以对响应进行修改、处理或记录日志等操作。


销毁阶段:

当 Web 应用程序关闭或过滤器被卸载时,过滤器会进入销毁阶段。在销毁阶段,可以执行一些资源释放或清理操作,如关闭数据库连接、释放文件句柄等。过滤器通过重写 destroy() 方法来实现自定义的销毁逻辑。


过滤器的生命周期包括创建和加载、初始化、请求处理、过滤器链、请求处理完成和响应返回、销毁等阶段。在这些阶段中,过滤器负责拦截和处理请求,以实现自定义的逻辑。


实际应用示例


权限过滤器


@Component
public class AuthorizationFilter implements GlobalFilter, Ordered {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        ServerHttpRequest request = exchange.getRequest();
        ServerHttpResponse response = exchange.getResponse();
        //1、获取请求路径
        String path = request.getPath().toString();
        //不需要拦截的地址
        if ("/test/test/TestController/test".equals(path) ) {
            return chain.filter(exchange);
        }
            //获取
        String openId = request.getHeaders().getFirst("Authorization");
        response.setStatusCode(HttpStatus.NOT_FOUND);
        return response.setComplete();
//        // 继续链式调用,交给下一个拦截器处理
//        return chain.filter(exchange);
    }
    @Override
    public int getOrder() {
        return 1;
    }


解析


GlobalFilter接口


public interface GlobalFilter {
    /**
     *  处理当前请求,有必要的话通过{@link GatewayFilterChain}将请求交给下一个过滤器处理
     *
     * @param exchange 请求上下文,里面可以获取Request、Response等信息
     * @param chain 用来把请求委托给下一个过滤器 
     * @return {@code Mono<Void>} 返回标示当前过滤器业务结束
     */
    Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain);
}


order接口


每一个过滤器都必须指定一个int类型的order值,order值越小,过滤器优先级越高,执行顺序越靠前。


两种方式:


实现order接口


d5c41298bad7316ba95ee0de143a25a4_6f72df6aa2394219b50b944d936870d0.png


方式二:在类上添加注解@Order


04867c64fcdb2114e40be92b7a586975_e14e7988b94549a3a32c4472998f8154.png


总结


网关过滤器是处理进出网络请求的重要组件,它们在Java中的实现通过javax.servlet.Filter接口提供了灵活和可扩展的方式。通过编写Java代码示例,我们展示了如何创建和使用网关过滤器,并介绍了过滤器链和过滤器的生命周期。


网关过滤器在现代网络应用程序中具有多种用途,包括提供安全性、访问控制、缓存、日志记录和负载均衡等功能。我们还提供了一些实际应用示例,如安全性过滤器、访问控制过滤器和日志记录过滤器,以展示网关过滤器在实际场景中的用法。


使用网关过滤器可以增加应用程序的安全性、性能和可扩展性。它们能够截取和处理进出网络请求,为开发人员提供了对请求和响应进行修改和增强的能力。通过适当配置和组织过滤器链,我们可以实现复杂的请求处理逻辑,并根据需要添加、删除或修改过滤器。


总之,网关过滤器是Java中强大的工具,为我们提供了处理网络请求的灵活性和控制能力。通过充分理解和应用网关过滤器的概念和技术,我们可以构建安全、高效和可靠的网络应用程序。


相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
相关文章
|
11月前
|
人工智能 缓存 监控
使用LangChain4j构建Java AI智能体:让大模型学会使用工具
AI智能体是大模型技术的重要演进方向,它使模型能够主动使用工具、与环境交互,以完成复杂任务。本文详细介绍如何在Java应用中,借助LangChain4j框架构建一个具备工具使用能力的AI智能体。我们将创建一个能够进行数学计算和实时信息查询的智能体,涵盖工具定义、智能体组装、记忆管理以及Spring Boot集成等关键步骤,并展示如何通过简单的对话界面与智能体交互。
3582 1
|
监控 Java Unix
6个Java 工具,轻松分析定位 JVM 问题 !
本文介绍了如何使用 JDK 自带工具查看和分析 JVM 的运行情况。通过编写一段测试代码(启动 10 个死循环线程,分配大量内存),结合常用工具如 `jps`、`jinfo`、`jstat`、`jstack`、`jvisualvm` 和 `jcmd` 等,详细展示了 JVM 参数配置、内存使用、线程状态及 GC 情况的监控方法。同时指出了一些常见问题,例如参数设置错误导致的内存异常,并通过实例说明了如何排查和解决。最后附上了官方文档链接,方便进一步学习。
3298 4
|
机器学习/深度学习 消息中间件 存储
【高薪程序员必看】万字长文拆解Java并发编程!(9-2):并发工具-线程池
🌟 ​大家好,我是摘星!​ 🌟今天为大家带来的是并发编程中的强力并发工具-线程池,废话不多说让我们直接开始。
454 0
|
11月前
|
人工智能 Java API
Java AI智能体实战:使用LangChain4j构建能使用工具的AI助手
随着AI技术的发展,AI智能体(Agent)能够通过使用工具来执行复杂任务,从而大幅扩展其能力边界。本文介绍如何在Java中使用LangChain4j框架构建一个能够使用外部工具的AI智能体。我们将通过一个具体示例——一个能获取天气信息和执行数学计算的AI助手,详细讲解如何定义工具、创建智能体并处理执行流程。本文包含完整的代码示例和架构说明,帮助Java开发者快速上手AI智能体的开发。
3532 8
|
10月前
|
人工智能 监控 Java
Java与AI智能体:构建自主决策与工具调用的智能系统
随着AI智能体技术的快速发展,构建能够自主理解任务、制定计划并执行复杂操作的智能系统已成为新的技术前沿。本文深入探讨如何在Java生态中构建具备工具调用、记忆管理和自主决策能力的AI智能体系统。我们将完整展示从智能体架构设计、工具生态系统、记忆机制到多智能体协作的全流程,为Java开发者提供构建下一代自主智能系统的完整技术方案。
1114 4
|
Java
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
354 9
|
Java 数据安全/隐私保护 计算机视觉
银行转账虚拟生成器app,银行卡转账截图制作软件,java实现截图生成工具【仅供装逼娱乐用途】
本内容提供Java生成自定义图片的示例代码,涵盖基础图像创建、文本添加及保存功能,适合学习2D图形编程。包括教学示例图片生成、文本图层处理和数字水印技术实现方案。
|
人工智能 自然语言处理 Java
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
FastExcel 是一款基于 Java 的高性能 Excel 处理工具,专注于优化大规模数据处理,提供简洁易用的 API 和流式操作能力,支持从 EasyExcel 无缝迁移。
4027 65
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
|
安全 Java 编译器
JD-GUI,java反编译工具及原理: JavaDecompiler一个Java反编译器
Java Decompiler (JD-GUI) 是一款由 Pavel Kouznetsov 开发的图形化 Java 反编译工具,支持 Windows、Linux 和 Mac Os。它能将 `.class` 文件反编译为 Java 源代码,支持多文件标签浏览、高亮显示,并兼容 Java 5 及以上版本。JD-GUI 支持对整个 Jar 文件进行反编译,可跳转源码,适用于多种 JDK 和编译器。其原理基于将字节码转换为抽象语法树 (AST),再通过反编译生成代码。尽管程序可能带来安全风险,但可通过代码混淆降低可读性。最新版修复了多项识别错误并优化了内存管理。
10932 1
|
SQL Java 索引
java小工具util系列2:字符串工具
java小工具util系列2:字符串工具
439 83