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

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 网关全局过滤器: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中强大的工具,为我们提供了处理网络请求的灵活性和控制能力。通过充分理解和应用网关过滤器的概念和技术,我们可以构建安全、高效和可靠的网络应用程序。


相关实践学习
通过日志服务实现云资源OSS的安全审计
本实验介绍如何通过日志服务实现云资源OSS的安全审计。
相关文章
|
4月前
|
机器学习/深度学习 消息中间件 存储
【高薪程序员必看】万字长文拆解Java并发编程!(9-2):并发工具-线程池
🌟 ​大家好,我是摘星!​ 🌟今天为大家带来的是并发编程中的强力并发工具-线程池,废话不多说让我们直接开始。
181 0
|
5月前
|
监控 Java Unix
6个Java 工具,轻松分析定位 JVM 问题 !
本文介绍了如何使用 JDK 自带工具查看和分析 JVM 的运行情况。通过编写一段测试代码(启动 10 个死循环线程,分配大量内存),结合常用工具如 `jps`、`jinfo`、`jstat`、`jstack`、`jvisualvm` 和 `jcmd` 等,详细展示了 JVM 参数配置、内存使用、线程状态及 GC 情况的监控方法。同时指出了一些常见问题,例如参数设置错误导致的内存异常,并通过实例说明了如何排查和解决。最后附上了官方文档链接,方便进一步学习。
559 4
|
3月前
|
Java 数据安全/隐私保护 计算机视觉
银行转账虚拟生成器app,银行卡转账截图制作软件,java实现截图生成工具【仅供装逼娱乐用途】
本内容提供Java生成自定义图片的示例代码,涵盖基础图像创建、文本添加及保存功能,适合学习2D图形编程。包括教学示例图片生成、文本图层处理和数字水印技术实现方案。
|
3月前
|
安全 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),再通过反编译生成代码。尽管程序可能带来安全风险,但可通过代码混淆降低可读性。最新版修复了多项识别错误并优化了内存管理。
1575 1
|
3月前
|
Java 数据安全/隐私保护
银行转账虚拟生成器app,银行卡转账截图制作软件,java实现截图生成工具【仅供装逼娱乐用途】
本项目提供了一套基于Java的图片处理教学方案,包含自定义图片生成、图像水印添加及合法电子凭证生成技术示例。
|
10月前
|
Java
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
204 9
|
11月前
|
监控 Java 测试技术
Java开发现在比较缺少什么工具?
【10月更文挑战第15天】Java开发现在比较缺少什么工具?
124 1
|
9月前
|
人工智能 自然语言处理 Java
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
FastExcel 是一款基于 Java 的高性能 Excel 处理工具,专注于优化大规模数据处理,提供简洁易用的 API 和流式操作能力,支持从 EasyExcel 无缝迁移。
1862 65
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
|
10月前
|
SQL Java 索引
java小工具util系列2:字符串工具
java小工具util系列2:字符串工具
242 83
|
9月前
|
Java 开发者 微服务
Spring Boot 入门:简化 Java Web 开发的强大工具
Spring Boot 是一个开源的 Java 基础框架,用于创建独立、生产级别的基于Spring框架的应用程序。它旨在简化Spring应用的初始搭建以及开发过程。
302 7
Spring Boot 入门:简化 Java Web 开发的强大工具

热门文章

最新文章