25.gateway的Filter 过滤器工厂(springcloud)

news2025/7/7 9:22:05
1 概述
gateway 里面的过滤器和 Servlet 里面的过滤器,功能差不多,路由过滤器可以用于修改进入Http 请求和返回 Http 响应
2 分类
2.1 按生命周期分两种
pre 在业务逻辑之前
post 在业务逻辑之后
2.2 按种类分也是两种

GatewayFilter 需要配置某个路由,才能过滤。如果需要使用全局路由,需要配置 Default Filters。

GlobalFilter 全局过滤器,不需要配置路由,系统初始化作用到所有路由上
全局过滤器 统计请求次数 限流 token 的校验 ip 黑名单拦截 跨域本质 (filter)
144 开头的电话 限制一些 ip 的访问
3 官方文档查看过滤器
3.1 单一过滤器( 31 个)
https://docs.spring.io/spring-cloud-gateway/docs/2.2.5.RELEASE/reference/
html/#gatewayfilter-factories

 

3.2 全局过滤器(9 个)

 

 4 自定义网关过滤器(重点)

4.1 自定义全局过滤器
全局过滤器的优点的初始化时默认挂到所有路由上,我们可以使用它来完成 IP 过滤,限流等功能
4.2 创建配置类MyGlobalFilter
package com.it.filter;

import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

import java.net.URI;
import java.util.HashMap;

/**
 * 定义了一个过滤器,
 * 需要给该过滤器指定执行顺序,通常一个项目中有多个过滤器,组成过滤器的责任链模式。
 */
@Component
public class MyGlobalFilter implements GlobalFilter, Ordered {

    /**
     * 这个就是全部过滤的方法
     * 常用责任链模式
     * @param exchange
     * @param chain
     * @return
     */
    @lombok.SneakyThrows
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        //针对请求的过滤,拿到请求 header url 参数
        ServerHttpRequest request = exchange.getRequest();

        String uri = request.getURI().getPath();
        System.out.println(uri);
        HttpHeaders headers = request.getHeaders();
        System.out.println(headers);
        String name = request.getMethod().name();
        System.out.println(name);
        String hostName = request.getRemoteAddress().getHostName();
        System.out.println(hostName);

        //响应相关的
        ServerHttpResponse response = exchange.getResponse();

        //放行,转入下一个过滤器
//        return chain.filter(exchange);

        //不放行
        response.getHeaders().set("content-type","application/json;charset=utf-8");
        //组装业务返回值
        HashMap<Object, Object> map = new HashMap<>();
        map.put("code", HttpStatus.UNAUTHORIZED.value());
        map.put("msg","你未授权!");
        ObjectMapper objectMapper = new ObjectMapper();
        //因为返回类型为Mono<Void>,所以需要把map转换成一个字节
        byte[] bytes = objectMapper.writeValueAsBytes(objectMapper);
        //通过buffer工厂将字节数组包装成一个数据包
        DataBuffer wrap = response.bufferFactory().wrap(bytes);
        return response.writeWith(Mono.just(wrap));


    }

    /**
     * 指定过滤器执行顺序的方法
     * 越小越先执行
     * @return
     */
    @Override
    public int getOrder() {
        return -1;
    }
}

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

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

相关文章

阿里同步神器Canal原理+安装+快速使用

文章目录前言Canal简介MySQL主备复制原理canal 工作原理1、MySQL配置1.1 修改MySQL配置支持binloglog-binmysql-binbinlog-formatROW1.2 创建canal用户1.3 重启mysql服务1.4 基本的查看binlog命令2、下载安装canal2.1 解压canal2.2 配置与mysql信息2.3 启动canal3. 快速使用3.1…

【文件传输】实现下载

文章目录下载&#xff1a;下载的过程&#xff1a;单文件传输&#xff1a;多文件传输&#xff1a;下载&#xff1a; 如下图&#xff1a; 如果刚发完size&#xff0c;客户端不回复ok&#xff0c;直接发送数据&#xff0c;会出现粘包问题。如果想要确保客户端收到数据&#xff0…

流行的前端开源报表工具有哪些?适合在企业级应用的

前端开源报表工具有很多&#xff0c;但是如果是企业级应用真心不建议选用。比如非要选择开源的报表工具&#xff0c;你需要投入一个或多个程序员来做这个事情&#xff0c;他们还得先学习这个开源报表工具的界面、功能使用操作等等&#xff0c;尤其是很多开源工具的学习资料还是…

dpdk Vhost 库

1、 怎么实现vhost_dev的VhostOps的vhost_set_vring_kick和vhost_set_vring_call&#xff1b; vhost_net kernel方式的vhost_set_vring_kick和vhost_set_vring_call依赖于/dev/vhost_net的ioctl。 有两种实现方式&#xff1a; 1、guest是server&#xff0c;dpdk vhost user是…

Sourcetree的实际使用开发笔记

目录 前言 一、Sourcetree是什么 二、Sourcetree使用步骤 1.创建仓库 2.拉取和推送的使用 3.创建新的自己的分支 三、使用Sourcetree来进行不提交本地的代码&#xff0c;而获取最新的代码拉取 总结 前言 本章主要是记录一下Sourcetree的基本使用功能。 一、Sourcetree是…

Android:Binder思考笔记

基础知识 进程空间划分 一个进程空间分为用户空间与内核空间。用户空间与内核空间都是虚拟内存&#xff0c;映射到物理内存。所有进程的内核空间映射到同一块物理内存&#xff0c;是共享的二者区别&#xff1a; 进程间&#xff0c;用户空间的数据不可共享&#xff0c;即用户空…

线性与树型数据结构可视化模拟器

线性与树型数据结构可视化模拟器 题目2:线性与树型数据结构可视化模拟器 [问题描述] 数据结构课程是计算机类专业的核心课程之一&#xff0c;是计算机科学与技术必修的专业基础课程。数据结构研究的范围和计算机软件有着密切的联系。课程涉及到大量的概念、定义以及数据结构的…

JS数据类型的探究

JS数据类型的探究 分思考三部曲? 是什么?为什么?怎么做? 一:什么是数据类型? 在程序设计的类型系统中&#xff0c;数据类型&#xff08;英语&#xff1a;Data type&#xff09;&#xff0c;又称资料型态、资料型别&#xff0c;是用来约束数据的解释。在编程语言中&…

我去面试聊了半天MySQL索引,结果面试官黑脸让我回家等结果...

V-xin&#xff1a;ruyuanhadeng获得600页原创精品文章汇总PDF 目录 1、面试真题2、面试官心理分析3、面试题剖析 1、面试真题 MySQ索引的原理和数据结构能介绍一下吗&#xff1f;b树和b-树有什么区别&#xff1f;MySQL聚簇索引和非聚簇索引的区别是什么&#xff1f;他们分别是…

影响网站排名的4个因素,教你提高网站排名的方法

我们优化网站的目的是&#xff0c;使网站的排名靠前&#xff0c;让更多的用户看到并访问网站&#xff0c;达到营销的效果。网站排名靠前&#xff0c;可以提高企业品牌的知名度&#xff0c;对网站是非常有益的。在网络多变的环境下&#xff0c;影响网站排名有哪些因素呢&#xf…

JAVA使用springboot整合佳博标签打印机(三)

在JAVA使用springboot整合佳博标签打印机&#xff08;二&#xff09;的文章中使用的是花生壳进行的内网穿透 花生壳内网穿透会有异常情况,因为使用的是花生壳免费版本的内网穿透,可能会有服务异常的情况出现,免费服务没有保障 优化方案使用NGINX替换花生壳来实现内网穿透 准…

从头开始实现一个留言板-README

前言 仓库地址&#xff1a;da1234cao/RestFulAPIDemo 由于我没做过C服务器的开发&#xff0c;没有这方面的工程经验&#xff0c;所以代码中&#xff0c;大概率有一些我意识不到的问题&#xff0c;欢迎提issue。 PS: 代码使用C实现restful接口&#xff0c;给前端提供数据读取…

如何封装一个实用的上传组件

前言 马上放假了&#xff0c;时间上相对宽裕&#xff0c;对最近做的东西进行一些总结。今天我们来看一个非常实用的组件&#xff0c;上传组件 我们先从组件的定位、组件的应用场景、组件的特性几个方面进行归纳 定位&#xff1a; 对于上传组件&#xff0c;基础的组件功能属…

【C++】-- 继承

目录 继承的概念及定义 继承的概念 继承的定义 定义格式 继承基类成员访问方式的变化 基类和派生类对象赋值转换 子类对象可以赋值给父类对象/指针/引用 派生类对象赋值给基类的对象 派生类对象赋值给基类的指针 派生类对象赋值给基类的引用 继承中的作用域 派生类的默认成员函…

IM开源项目OpenIM部署文档-从准备工作到nginx配置

IM开源项目OpenIM部署文档-从准备工作到nginx配置 2022-11-14 22:27OpenIM 一、准备工作 运行环境 linux系统即可&#xff0c; Ubuntu 7.5.0-3ubuntu1~18.04最优 图片视频文件存储 支持cos/MinIO https/wss协议 1. 需申请域名或者子域名&#xff08;web im端登录注册及im…

C# HTML

一 HTML 超文本标记语言 在HTML当中存在着大量的标签&#xff0c;我们用HTML提供的标签&#xff0c;将要显示在网页中的内容包含起来。就构成了我们的网页。 二 CSS CSS 控制网页内容显示的效果。 HTMLCSS静态网页。 JSJquery 动态效果。 三 开始动手写HTML页面 ① 首先在…

XSS进阶二

目录实验目的预备知识实验环境实验步骤一实例四、换一个角度&#xff0c;阳光依旧实验步骤二实例五、限制了我的左手&#xff0c;我还有右手实验步骤三实例六、大胆去思考&#xff0c;小心去求证实验目的 1.深入理解xss工作原理。 2.怎么去绕过规则实现xss。 3.培养学生的独立…

Spring Cloud(十):Spring Cloud Skywalking

链路追踪组件选型 Zipkin是Twitter开源的调用链分析工具&#xff0c;目前基于springcloud sleuth得到了广泛的使用&#xff0c;特点是轻量&#xff0c;使用部署简单。Pinpoint是韩国人开源的基于字节码注入的调用链分析&#xff0c;以及应用监控分析工具。特点是支持多种插件&…

XCTF-web Robots

场景一&#xff1a;Training-WWW-Robots 进入场景&#xff0c;提示关于robots.txt文件 访问robots.txt文件&#xff0c;目录下存在 /fl0g.php 文件&#xff0c;进一步访问得到flag 场景二&#xff1a;robots 根据题目&#xff0c;提示关于robots.txt协议 访问成功&#xff…

api股票数据接口能实现什么功能?

api股票数据接口在量化投资方面能够受到比较多交易者的开发和使用的&#xff0c;主要是得于股票量化交易数据接口的7个策略十档行情&#xff0c;可以实现一键解决炒股难题&#xff0c;和多指标辅助追踪主力&#xff0c;跟主力做强势股&#xff0c;只有在行股票数据接口一键就可…