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

news2024/11/14 10:58:39

文章目录

  • 网关过滤器简介
  • 网关过滤器的作用
  • 过滤器的生命周期
  • 实际应用示例
    • 权限过滤器
      • 解析
  • 总结

网关过滤器简介

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

网关提供了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接口

在这里插入图片描述

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

在这里插入图片描述

总结

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

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/684384.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

测试老鸟的职业生涯,从初识到功能再到自动化测试,他都经历了啥...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 张工&#xff1a;…

Qt/C++编写onvif工具(搜索/云台/预置位/OSD/录像存储)

一、前言 从最初编写这个工具开始的时间算起来&#xff0c;至少5年多&#xff0c;一直持续完善到今天&#xff0c;这个工具看起来小也不小大也不大&#xff0c;但是也是经历过无数个现场的洗礼&#xff0c;毫不夸张的说&#xff0c;市面上能够遇到的主流的厂商的设备&#xff…

深入探究 ReentrantLock 的应用和原理

博主介绍&#xff1a; ✌博主从事应用安全和大数据领域&#xff0c;有8年研发经验&#xff0c;5年面试官经验&#xff0c;Java技术专家✌ Java知识图谱点击链接&#xff1a;体系化学习Java&#xff08;Java面试专题&#xff09; &#x1f495;&#x1f495; 感兴趣的同学可以收…

微信开发者工具-导入小程序项目会自动切换到小游戏打开出错的解决方案

微信开发者工具导入小程序项目会自动切换到小游戏打开出错&#xff0c; 提示Error 提示appid错误&#xff0c;如下图 错误 Error: INVALID_TOKEN...表示网络已断开&#xff0c; 检查开发工具是否连接到网络&#xff0c; 或注销重新登录开发工具试试 提示缺少文件 如果提示缺…

智能安全用电技术电气火灾监控的应用介绍 安科瑞 许敏

摘要&#xff1a;智能安全用电技术在智慧监狱的应用&#xff0c;可以提升监狱智能化管控水平和降低能耗。文章以智能安全用电技术为入手点&#xff0c;简要分析了监狱用电现状&#xff0c;论述了智能安全用电技术在智慧监狱中的具体应用&#xff0c;对智能安全用电技术在智慧监…

【面试题12】HTTP协议三次握手和四次挥手分别是什么

文章目录 一、概览二、三次握手2.1 第一步&#xff1a;客户端向服务端发送 SYN&#xff08;同步&#xff09;包2.2 第二步&#xff1a;服务端返回 ACK&#xff08;确认&#xff09;包和 SYN 包2.3 第三步&#xff1a;客户端返回 ACK&#xff08;确认&#xff09;包 三、四次挥手…

今日分享:音频格式转换软件

小林最近特别喜欢唱歌&#xff0c;不过总是遇到一些麻烦&#xff0c;例如自己录制的音频格式无法在其他设备上播放&#xff0c;或者想把某个歌曲转成适合自己播放的格式。这时候就需要一个好用的音频格式转换器啦&#xff01;小林找了一圈&#xff0c;终于找到了几款可爱又好用…

大数据应用——工程实践III

任务一&#xff1a;完成Hadoop集群部署前环境的准备工作 1.1 虚拟机环境准备 1. 安装虚拟机 2. 克隆虚拟机 3. 修改网络配置 4. 修改主机名和映射 5. 关闭防火墙 1.2 安装JDK 1.3 安装Hadoop 1.4 集群配置 1. 编写集群分发脚本xsync 2. 集群部署规划 表 1.1 hadoop101 …

一份老网工珍藏多年的网络配置笔记

我的网工朋友大家好 俗话说得好&#xff0c;好记性不如烂笔头。 学生时代&#xff0c;我们考试前最喜欢看的就是学霸笔记&#xff0c;但工作之后&#xff0c;却没有人会愿意借给你他们的珍藏笔记了。 今天&#xff0c;想给你分享一个老网工分享在网上的精选笔记&#xff0c;…

java 8 新特性讲解Optional类--Fork/Join 框架--新时间日期API--以及接口的新特性和注解

Optional类 到目前为止&#xff0c;臭名昭著的空指针异常是导致Java应用程序失败的最常见原因。以前&#xff0c;为了解决空指针异常&#xff0c;Google公司著名的Guava项目引入了Optional类&#xff0c;Guava通过使用检查空值的方式来防止代码污染&#xff0c;它鼓励程序员写…

六、Docker容器数据卷

学习参考&#xff1a;尚硅谷Docker实战教程、Docker官网、其他优秀博客(参考过的在文章最后列出) 目录 前言一、容器数据卷1.1 容器数据卷1.2 怎么用1.3 能干什么 二、实践案例2.1 启动ubuntu容器实例&#xff0c;挂载目录&#xff1a;2.2 在ubuntu容器实例的/tmp/docker_data中…

Android 组件化架构思路

作者&#xff1a;往事一块六毛八 为什么要模块化/组件化 随着APP版本不断的迭代&#xff0c;新功能的不断增加&#xff0c;业务也会变的越来越复杂&#xff0c;APP业务模块的数量有可能还会继续增加&#xff0c;而且每个模块的代码也变的越来越多&#xff0c;这样发展下去单一…

GNS3报错“unable to open TAP device tap0 (No such file or directory)”解决

系统&#xff1a;MacOS 13.4 GNS3版本&#xff1a;2.2.35.1 Tunnelblick&#xff1a;3.8.8b 起因 在gns3中使用cloud节点创建 tap 接口连接路由器报错&#xff1a; 解决办法 借助 Tunnelblick工具创建 Tap 虚拟网卡。Tunnelblick下载地址&#xff1a; https://tunnelblic…

Kubernetes入门实战课-初始容器

Kubernetes入门实战课-初始容器 文章目录 Kubernetes入门实战课-初始容器课前准备初始容器Docker 的形态Docker 的安装Docker 的架构 容器的本质隔离原因与虚拟机区别隔离是怎么实现的 镜像创建容器镜像&#xff1a;如何编写正确、高效的Dockerfile镜像的内部机制是什么Dockerf…

MySQL数据库连接查询和存储过程

MySQL数据库连接查询和存储过程 一、连接查询1、内连查询2、左连接3、右链接 二、存储过程1、存储过程简介2、存储过程的优点3、语法3.1 参数分类3.2 不加参数的存储过程3.3 带参数的存储过程3.4删除存储过程3.5 事务和存储过程有什么区别&#xff1f; 三、总结1、连接查询2、存…

【Java项目中 利用Redis实现数据缓存】

文章目录 Java SpringBoot项目中 用Redis实现数据缓存1 环境搭建1.1 maven坐标1.2 配置文件1.3 配置类 2 实现缓存短信验证码3 缓存菜品数据4 Spring Cache 缓存框架4.1 Spring Cache介绍4.2 Spring Cache常用注解4.3 Spring Cache使用方式 Java SpringBoot项目中 用Redis实现数…

一文了解Moonbeam互连合约

什么是互连合约Connected Contracts 简单来说&#xff0c;互连合约是通过Moonbeam连接其他区块链上的一个或多个智能合约&#xff0c;其允许目标链上的用户通过跨链消息传递协议在一个应用中操作不同链上的资产或是服务。 通过互连合约方案&#xff0c;不同迥异的公链技术架构…

计算机内部总线详解

文章目录 总线概述地址总线位宽 数据总线位宽CPU性能指标 例题 总线概述 众所周知&#xff0c;总线就是用来帮助连接两个或多个计算机组件&#xff0c;用于数据传输&#xff0c;计算机内部存在三种类型的总线&#xff1a; 地址总线&#xff1a;用于传输指示计算机中的内存或外…

【uboot1】常用指令

文章目录 1.U-Boot命令之常用命令&#xff1a;7.U-Boot命令之EMMC和SD卡操作命令&#xff1a;一般EMMC和SD卡是同一个东西&#xff0c;没特殊说明&#xff0c;统一MMC来代指EMMC和SD卡8.U-Boot命令之内存操作命令&#xff1a;直接对DRAM进行读写操作&#xff0c;uboot命令中的数…

MySQL数据库高级查询语句

MySQL数据库高级查询语句 一、语句SELECT ----显示表格中一个或数个字段的所有数据记录DISTINCT ----不显示重复的数据记录WHERE ----有条件查询AND OR ----且 或IN ----显示已知的值的数据记录BETWEEN ----显示两个值范围内的数据记录通配符 ----通常通配符都是跟 LIKE 一起使…