Spring Cloud Alibaba Gateway全局token过滤、局部过滤访问时间超过50ms日志提示

news2024/11/19 13:39:52

文章目录

  • Spring Cloud Alibaba Gateway验证token
    • 在前篇的基础上加入依赖
    • 在filter包中创建tokenFilter
  • Spring Cloud Alibaba Gateway局部过滤
    • 1.继承AbstractGatewayFilterFactory
    • 2.仿照AddRequestHeaderGatewayFilterFactory

Spring Cloud Alibaba Gateway验证token

基础搭建
前篇

在前篇的基础上加入依赖

<dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.8.18</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

在filter包中创建tokenFilter

@Component
@Slf4j
public class TokenFilter implements GlobalFilter, Ordered {
    @Value("${token.key}")
    private String tokenKey;
    private static final String TOKEN = "token";

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {

        //生成一个token
/*        Map<String, Object> map = new HashMap<>();
        map.put("id", 100);
        map.put("nickName", "张三");
        map.put("tel", "10086");
        map.put(JWT.EXPIRES_AT, System.currentTimeMillis() + 2 * 24 * 6 * 6 * 1000);
        String token1 = JWTUtil.createToken(map, tokenKey.getBytes());*/

        List<String> strings = exchange.getRequest().getHeaders().get(TOKEN);
        ServerHttpResponse response = exchange.getResponse();

        if (ObjectUtil.isEmpty(strings)) {
            log.debug("token为空,不予通行");

            response.setStatusCode(HttpStatus.UNAUTHORIZED);
            return response.setComplete();
        }
        String token = strings.get(0);
        boolean verify = false;
        try {
            verify = JWTUtil.verify(token, tokenKey.getBytes(StandardCharsets.UTF_8));
        } catch (Exception ex) {
            log.error("出现错误{}", ex.getMessage());
            ex.printStackTrace();
        }

        if (!verify) {
            log.error("token不对,不要投机取巧");
            response.setStatusCode(HttpStatus.UNAUTHORIZED);
            return response.setComplete();
        }

        JWTPayload payload = JWTUtil.parseToken(token).getPayload();
        log.info("通过,大大滴好!!");
        return chain.filter(exchange);
    }

    //配置第一顺位执行
    @Override
    public int getOrder() {
        return 1;
    }
}

自行访问
在这里插入图片描述

Spring Cloud Alibaba Gateway局部过滤

1.继承AbstractGatewayFilterFactory

加入配置
spring.cloud.gateway.routes[0].filters[4] = LogTime=50

  • 这里配置的LogTime 与 类名前面的对应
  • AbstractNameValueGatewayFilterFactory可以仿照这个类写 进入ieda 两下shift
@Component
@Slf4j
public class LogTimeGatewayFilterFactory extends AbstractGatewayFilterFactory<LogTimeGatewayFilterFactory.Config> {

    private String TIMESPAN = "timeSpan";
    public LogTimeGatewayFilterFactory() {
        super(LogTimeGatewayFilterFactory.Config.class);
    }
    public List<String> shortcutFieldOrder() {
        return Arrays.asList(TIMESPAN);
    }
    @Override
    public GatewayFilter apply(Config config) {
        return new GatewayFilter() {
            @Override
            public Mono<Void> filter(ServerWebExchange exchange,GatewayFilterChain chain) {
                long start = System.currentTimeMillis();
                exchange.getAttributes().put("start", start);
                return chain.filter(exchange).then(Mono.fromRunnable(()->{
                    long end = System.currentTimeMillis();
                    long start1 = exchange.getAttribute("start");
                    HttpRequest request = exchange.getRequest();
                    URI uri = request.getURI();
                    if(config.timeSpan > (end - start1)){
                        log.info("uri伟{}不错!{}在50ms之内",uri,end - start1);
                    }
                    log.info("uri伟{}不行!太慢啦{}",uri,end - start1);

                }));
            }
        };
    }
    @Validated
    //启用参数验证似乎
    public static class Config{
        private int timeSpan;

        public int getTimeSpan() {
            return timeSpan;
        }

        public void setTimeSpan(int timeSpan) {
            this.timeSpan = timeSpan;
        }
    }

}

2.仿照AddRequestHeaderGatewayFilterFactory

继承AbstractNameValueGatewayFilterFactory

@Component
@Slf4j
public class LogTime2GatewayFilterFactory extends AbstractNameValueGatewayFilterFactory{

    public LogTime2GatewayFilterFactory() {
    }

    public GatewayFilter apply(final AbstractNameValueGatewayFilterFactory.NameValueConfig config) {
        return new GatewayFilter() {
            @Override
            public Mono<Void> filter(ServerWebExchange exchange,GatewayFilterChain chain) {
                long start = System.currentTimeMillis();
                exchange.getAttributes().put("start", start);
                return chain.filter(exchange).then(Mono.fromRunnable(()->{
                    long end = System.currentTimeMillis();
                    long start1 = exchange.getAttribute("start");
                    HttpRequest request = exchange.getRequest();
                    URI uri = request.getURI();
                    if(Integer.parseInt(config.getValue()) > (end - start1)){
                        log.info("logTime2 uri伟{}不错!{}在50ms之内",uri,end - start1);
                    }
                    log.info("logTime2 uri伟{}不行!太慢啦{}",uri,end - start1);

                }));
            }

            public String toString() {
                return GatewayToStringStyler.filterToStringCreator(LogTime2GatewayFilterFactory.this).append(config.getName(), config.getValue()).toString();
            }
        };
    }

}

证明参数注入成功
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

linux上gitlab备份与还原

三 Gitlab备份 1.gitlab安装 1.1 添加镜像地址 添加镜像地址的目的是为了提高国内用户软件下载的速度&#xff0c;编辑(新建)文件gitlab-ce.repo&#xff0c;指令&#xff1a; vi /etc/yum.repos.d/gitlab-ce.repo复制 输入&#xff1a; [gitlab-ce] namegitlab-ce # 清华…

基于SSM+Vue的亿互游在线平台的设计与开发

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用Vue技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

LeetCode01

LeetCode01 两数之和 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和 为目标值 target 的那两个整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里不能重复出现。 你…

Unity制作射击游戏案例01

整理逻辑思路&#xff1a; //【业务逻辑】这个脚本用来1.控制物体移动旋转&#xff08;WASD&#xff09;、 2.发射子弹&#xff08;空格键&#xff09; //【程序逻辑2】 首先检测用户没有按下空格键 2.如果按下呢执行发射子弹函数 3.克隆子弹 4.让克隆的子弹往前跑 搭…

Seata 基于改良版雪花算法的分布式 UUID 生成器分析

一般来说&#xff0c;除了“全局唯一”这个基本属性之外&#xff0c;还会要求生成出来的 ID 具有“递增趋势”&#xff0c;这样的好处是能减少 MySQL 数据页分裂的情况&#xff0c;从而减少数据库的 IO 压力&#xff0c;提升服务的性能。 雪花算法&#xff0c;就是一个能生产全…

浅谈霍尔电流传感器在汽车电池管理系统中的应用

摘要&#xff1a; 随着电动汽车和混合动力汽车的需求和产量正在增加&#xff0c;两种类型的车辆都需要高电流容量的电池来运行50kW 或更高功率的电机&#xff0c;并且这些都使用高压系统。汽车电池管理系统中对于电流的测量检测需要隔离测量的方式&#xff0c;而霍尔电流传感器…

【DLL修复工具下载】一键修复电脑丢失d3dcompiler_47.dll问题方法

在我们使用电脑的过程中&#xff0c;有时候会遇到一些错误提示&#xff0c;其中“缺失 d3dcompiler_47.dll”就是比较常见的一种。那么&#xff0c;d3dcompiler_47.dll 到底是什么呢&#xff1f;为什么会出现缺失的情况&#xff1f;丢失 d3dcompiler_47.dll 又会对电脑产生什么…

电压放大器如何选型号和参数配置

选择适合的电压放大器型号和配置参数是设计电子系统中至关重要的一步。电压放大器是一种关键的电子器件&#xff0c;用于将输入电压信号放大到所需的输出电压级别。下面西安安泰将详细介绍如何选择电压放大器的型号和配置参数。 确定应用需求&#xff1a;首先&#xff0c;需要明…

MyBatis 日志模块

文章目录 前言LogLogFactory日志应用JDBC 日志BaseJdbcLoggerConnectionLogger应用实现 总结 前言 日志在我们开发过程中占据了一个非常重要的地位&#xff0c;是开发和运维管理之间的桥梁&#xff0c;在Java中的日志框架也非常多&#xff0c;Log4j、Log4j2、slf4j等&#xff…

孙宇晨:稳定币支付交易具百倍增长潜力 后FTX时代行业仍需修炼内功

9月14日,波场TRON创始人、火币HTX全球顾问委员会成员孙宇晨受邀出席于新加坡举办的TOKEN 2049,并参加了“生态系统和行业增长:展望加密货币的未来十年”主题板块的讨论。孙宇晨在发言中表示,接下来的 10 年里,加密货币和区块链的最大日常应用场景仍然是稳定币支付交易,预计将有…

nodeJs+Mongodb+mongoose入门

nodeJsexpressMongodbmongooseNavicat 自我记录 一、简介 1.1 Mongodb 是什么 MongoDB 是一个基于分布式文件存储的数据库&#xff0c;官方地址 https://www.mongodb.com/ 1.2 数据库是什么 数据库&#xff08;DataBase&#xff09;是按照数据结构来组织、存储和管理数据…

KF32A学习笔记(一):工程导入、编译烧录方法(KF32 IDE+ KF32 PRO)

目录 概述KF32 IDE打开现有项目工程1.工程导入2.编译工程3.下载程序 KF32 PRO 概述 本文主要是对KF32A150芯片程序的编译、烧录方法进行说明。针对开发过程中的编译烧录和无代码情况下的烧录两种场景&#xff0c;需要安装ChipON PRO KF32和ChipON IDE KF32两个上位机工具&…

Linux Qt5.15.2 编译QWebEngine源码支持音视频H264

背景 默认自带的QWebEngine 因版权问题不支持音视频功能&#xff0c;需要自己编译源码以支持。 平台&#xff1a;Linux&#xff08;UOS V20 1050&#xff09; Qt&#xff1a;5.15.2 准备工作 下载 Qt 5.15.2 对应版本源码&#xff0c;使用镜像网站或者Qt Maintenance Tool工…

MyCat主从数据库集群搭建

1 背景 最近工作需要对比几种数据库技术方案&#xff0c;主从读写分离集群也是其中之一。接着上一篇文章《MySQL主从数据库搭建》基础上继续搭建MyCat主从集群。 2 MyCat 什么是MyCat?MyCat是数据库中间件&#xff0c;就是介于数据库和应用之间&#xff0c;进行数据处理与交互…

易点易动库存管理系统:引领库存用量控制新时代,助力企业节约成本

在现代企业经营中&#xff0c;库存管理一直是一个关键的环节。过多的库存会造成资金占用和浪费&#xff0c;而过少的库存则容易导致生产中断和客户满意度下降。为了解决这一难题&#xff0c;易点易动库存管理系统应运而生。 一、全面的库存数据管理 易点易动库存管理系统通过与…

AP5193 DC-DC恒流转换器 消防应急 灯汽车灯 应急日光灯太阳能灯驱动IC

AP5193是一款PWM工作模式,高效率、外围简单、 内置功率MOS管&#xff0c;适用于4.5-100V输入的高精度 降压LED恒流驱动芯片。电流2.5A。AP5193可实现线性调光和PWM调光&#xff0c;线性调光 脚有效电压范围0.55-2.6V. AP5193 工作频率可以通过RT 外部电阻编程来设定&#xff0c…

融云观察:AI Agent 是不是游戏赛道的下一个「赛点」?

本周四 融云直播间&#xff0c;点击报名~ ChatGPT 的出现&#xff0c;不仅让会话成为了未来商业的基本形态&#xff0c;也把大家谈论 AI 的语境从科技产业转向了 AI 与全产业的整合。 关注【融云全球互联网通信云】了解更多 而目前最热衷于拥抱生成式 AI 的行业中&#xff0c…

Springboot整合之Shiro和JWT技术实现无感刷新

一、Shiro简介 Shiro是Java领域非常知名的认证&#xff08; Authentication &#xff09;与授权 &#xff08; Authorization &#xff09;框架&#xff0c;用以替代JavaEE中的JAAS功能。相 较于其他认证与授权框架&#xff0c;Shiro设计的非常简单&#xff0c;所以广受好 评。…

互联网架构演进方向

目录 1 业务架构1.1 单体模式1.2 中台战略1.2.1 概述1.2.2 背景1.2.3 案例 1.3 总结与思考 2 数据架构2.1 单数据库2.2 主从读写2.3 分库分表2.4 高速缓存2.5 数据多样化2.5.1 分布式文件2.5.2 nosql2.5.3 搜索引擎2.5.4 架构特点 3、应用架构3.1 单机调优3.2 动静分离3.3 分布…

【李沐深度学习笔记】矩阵计算(2)

课程地址和说明 线性代数实现p4 本系列文章是我学习李沐老师深度学习系列课程的学习笔记&#xff0c;可能会对李沐老师上课没讲到的进行补充。 本节是第二篇 矩阵计算 矩阵的导数运算 此处参考了视频&#xff1a;矩阵的导数运算 为了方便看出区别&#xff0c;我将所有的向量…