【RuoYi项目分析】在RuoYi网关实现验证码功能

news2024/11/20 13:31:35

文章目录

  • 1. 验证码功能的类清单
  • 2. 验证码的实现
    • 2.1. 验证码的获取
    • 2.2. 验证码的校验
  • 3. 总结
  • 4. 资料参考

本文主要介绍了用户如何实现验证码,以及该功能如何与 Spring Gateway 联系起来。

1. 验证码功能的类清单

功能
CaptchaProperties验证码的 yml 配置
CaptchaConfig验证码图形的具体实现(有数字和字符 2 种)
RouterFunctionConfiguration定义路由,这是相对 controller 一种新的路由定义方式。
ValidateCodeHandler路由RouterFunction需要HandlerFunction。桥梁作用。
ValidateCodeService、ValidateCodeServiceImpl验证码功能的实现逻辑(即 service,serviceImpl
ValidateCodeFilter针对特定请求需要验证码验证通过才可以

从以上类的清单也可以看出验证码的功能主要包括 2 个方面:

  • 验证码如何实现

主要用 google 的kaptcha来生成图片;以及用 redis 来实现的

涉及到的类:CaptchaConfig、CaptchaProperties、ValidateCodeServiceImpl

  • 验证码如何与 Spring Gateway 的组件联系起来

这一点主要与 Spring Gateway 的工作原理有关系,DispatcherHandler 是 Spring Gateway 最核心的类,负责分发请求,原理跟 MVC 的 DispatcherServlet 非常相似,先暂时不表。

涉及到的类有:RouterFunctionConfiguration、ValidateCodeHandler、ValidateCodeFilter

2. 验证码的实现

2.1. 验证码的获取

  • 定义了获取验证码的路由函数RouterFunction

功能:在请求处理阶段,请求由DispatcherHandler转发到RouterFunctionMapping,再到RouterFunction中定义了处理器HandlerFunction

处理过程:Servlet服务器 —> DispatcherHandler —> handlerMapping列表 —> 某个RouterFunctionMapping —> 根据RouteFunction到具体的RouteFunction —> HandlerFunction —> Service —> ServiceImpl。

  • 定义了验证码的处理器HandlerFunction

功能:关联 RouteFunction 和 ValidateCodeService

  • 定义了一个验证码的配置类CaptchaConfig

启动定义了2个Bean的配置,一个是字符验证码,一个是数字验证码

  • 如何生成验证码

分2种验证码:一种是数字的,一种是字符的
1、数字的:一个方法用来创建数学结果,一个方法用来创建image
2、字符的:一个方法用来创建数学结果,一个方法用来创建image
3、把数学结果缓存到redis中

  • 返回前端uuid和base64的图片

2.2. 验证码的校验

  • 在nacos配置中心只对auth模块配置了验证码的过滤器
      routes:
        # 认证中心
        - id: ruoyi-auth
          uri: lb://ruoyi-auth
          predicates:
            - Path=/auth/**
          filters:
            # 验证码处理
            - CacheRequestFilter
            - ValidateCodeFilter
            - StripPrefix=1
  • 如果路由匹配了predicate的规则,则进行filter的处理

疑问:如果有多个处理器,那么执行顺序是怎么样的。
解答:
1、先找到断言处理器的映射规则类RoutePredicateHandlerMapping
2、该类的getHandlerInternal方法中的lookupRoute方法会决定采用哪一个route,并设置到request属性中
3、然后是FilteringWebHandler的handler方法
4、handler方法中获取到route的gatewayFilters和全局的globalFilters,然后按照order升序排序。

猜测route的gatewayFilters的order属性1,2,3是不是按照配置中心配置排序的。改变下配置中心的配置重新debug观察下。(猜测正确)

  • filter的顺序问题

结合gatewayFilters是按照配置文件的顺序(order是1,2,3依次递增),globalFilters也是按照order的顺序排序。所以对于RuoYi的过滤器来说顺序是:

AuthFilter(order=-200)
XssFilter(order=-100)
CacheRequestFilter(order=1)
ValidateCodeFilter(order=2)
StripPrefix(order=3)

3. 总结

1、验证码如何实现
这是用户需要考虑的问题,如何实现验证码,最好是能配置不同的验证码

RuoYi 实现了“数字验证码”和“字符验证码”2 种。

2、如何与 Spring Gateway 结合
这是架构师需要考虑的框架问题。如何与 Spring Gateway 结合;那些模块需要配置这个过滤器;那些情况需要验证码;

RuoYi 配置了 auth 模块的 【“/auth/login”, “/auth/register”】2 个请求需要验证码。

4. 资料参考

语雀笔记地址:https://www.yuque.com/yuchangyuan/tkb5br

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

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

相关文章

算法-数学-斜率-直线上最多的点数

算法-数学-斜率-直线上最多的点数 1 题目概述 1.1 题目出处 https://leetcode.cn/problems/max-points-on-a-line/ 1.2 题目描述 给你一个数组 points ,其中 points[i] [xi, yi] 表示 X-Y 平面上的一个点。求最多有多少个点在同一条直线上。 2 暴力搜索斜率…

Go 基本数据类型和 string 类型介绍

Go 基础之基本数据类型 文章目录 Go 基础之基本数据类型一、整型1.1 平台无关整型1.1.1 基本概念1.1.2 分类有符号整型(int8~int64)无符号整型(uint8~uint64) 1.2 平台相关整型1.2.1 基本概念1.2.2 注意点1.2.3 获取三个类型在目标…

postgresql-自增字段

postgresql-自增字段 标识列IdentitySerial类型Sequence序列 标识列Identity -- 测试表 create table t_user( -- 标识列自增字段user_id integer generated always as identity primary key,user_name varchar(50) not null unique );-- 自动生成序列 CREATE SEQUENCE public…

学位论文的写作方法,较好的参考文章

摘要 结合2个文章: [1]程鑫. 网联环境下交通状态预测与诱导技术研究[D]. 长安大学, 2017. [2]吴昊. 关中平原水资源变化特征与干旱脆弱性研究[D]. 长安大学, 2018. 主要研究内容及技术路线 各章小结和引言的写作 [1]程鑫. 网联环境下交通状态预测与诱导技术…

一文拿捏分布式协调Redis客服端-Redisson

Redisson 1.介绍 Redisson - 是一个高级的分布式协调Redis客服端 , 专注于分布式系统开发,让用户可以在分布式系统中很方便的去使用Redis。 2.相关使用 1.加锁 //底层是lua脚本保证了加锁的原子性 // 一直等待获取锁,直到获取到锁为止! 默认锁的存活…

【SimpleDateFormat】线程不安全问题分析及解决方案

前言 在日常开发中,我们经常需要去做日期格式转换,可能就会用到SimpleDateFormat类。但是,如果使用不当,就很容易引发生产事故! 1. 问题推演 1.1 初始日期工具类 刚开始的日期转换工具类可能长这样: p…

nodejs+vue晓海网上订餐系统elementui

管理员功能需求 管理员登陆后,主要模块包括首页、个人中心、用户管理、菜单信息管理等功能。 第三章 系统分析 10 3.1需求分析 10 3.2可行性分析 10 3.2.1技术可行性:技术背景 10 3.2.2经济可行性 11 3.2.3操作可行性: 11 3.3性能分析 11 3.4…

创建GCP service账号并管理权限

列出当前GCP项目的所有service account 我们可以用gcloud 命令 gcloud iam service-accounts list gcloud iam service-accounts list DISPLAY NAME EMAIL DISABLED terraform …

数据结构 1.1 初学数据结构

数据结构的基本概念 数据结构在学什么? 如何用程序代码把现实世界的问题信息化 如何用计算机高效处理信息从而创造价值 数据: 数据元素、数据项: 数据元素——描述一个个体 数据对象——数据元素之间具有同样的性质 同一个数据对象里的数…

BGP高级特性——4字节AS号

目录 4字节AS号 相关概念 两种过渡属性 4字节AS号的格式 4字节AS号建立邻居 4字节AS号路由传递 配置命令 4字节AS号 相比于2字节AS号,范围更大。由1~65535扩展到1~4294967295 支持4字节AS号的BGP设备兼容仅支持2字节AS号的BGP设备 相关概念 Speaker&#…

13链表-简单思路练习

目录 LeetCode之路——876. 链表的中间结点 分析: 解法一:常规思路 解法二:快慢指针 LeetCode之路——876. 链表的中间结点 给你单链表的头结点 head ,请你找出并返回链表的中间结点。 如果有两个中间结点,则返回…

详解Linux的系统调用fork()函数

在Linux系统中,fork()是一个非常重要的系统调用,它的作用是创建一个新的进程。具体来说,fork()函数会在当前进程的地址空间中复制一份子进程,并且这个子进程几乎完全与父进程相同,包括进程代码、数据、堆栈以及打开的文…

利用Redis实现全局唯一ID

利用Redis实现全局唯一ID 背景 场景分析:如果我们的id具有太明显的规则,用户或者说商业对手很容易猜测出来我们的一些敏感信息,比如商城在一天时间内,卖出了多少单,这明显不合适。 场景分析二:随着我们商…

怎么将本地代码文件夹通过Git 命令上传到启智平台仓库

在本地创建一个与启智平台仓库同样名字的文件夹 然后在本地文件夹右键–>选择Git Bash Here,就会打开Git命令窗口 初始化本地仓库 git init将项目文件添加到Git git add .提交更改: 使用以下命令提交您的更改,并为提交添加一条描述性的消息&#…

ArcGIS Engine:实现Shp/Mxd数据的加载、图层的简单查询

本博客参考&#xff1a;BiliBili UP主 <羊羊旸> &#xff1a; Arcgis Engine学习 目录 01 加载控件以及控件的基本信息等调整 02 编写 <菜单-地图控件> 中各个子工具的代码 2.1 加载Shapefile数据-代码 2.2 加载地图文档数据-代码 2.3 获取图层数量-代码 2.…

lv7 嵌入式开发-网络编程开发 04 IP地址与端口号

目录 1 IP地址 1.1 IP 地址及其表示方法 1.2 分类的 IP 地址 1.3 无分类编址 CIDR 1.3.1 网络前缀 1.3.2 地址块 1.3.3 地址掩码 (address mask) 1.4 IPv6 的地址 1.4.1 表示方式 1.4.2 零压缩 2 端口号 2.1 进程之间的通信 2.2 运输层的作用 2.3 屏蔽作用 2.4…

CompletableFuture 异步编排

目录 CompletableFuture 的详解代码测试配置类的引入Demo1Demo2CompletableFuture的async后缀函数与不带async的函数的区别ThreadPoolTaskExecutor 和 ThreadPoolExecutor 的区别Spring 线程池的使用业务使用多线程的原因场景一:场景二:FutureTask介绍线程池为什么要使用阻塞队…

(三) Markdown插入互联网或本地视频解决方案

前言 不论博客系统是WordPress还是Typecho&#xff0c;绕不开的是两种书写语言&#xff0c;一种称之为富文本&#xff0c;一种叫做Markdown。 Markdown有很多好处&#xff0c;也有很多坏处&#xff0c;比如Markdown本身不具备段落居中的功能&#xff0c;以及Markdown也不具有…

聊聊JAVA中的锁优化锁升级及其底层原理剖析

文章目录 1. 基础介绍java中的锁什么是锁优化和锁升级 2. Java中的锁升级过程及底层原理1. 偏向锁实现机制和原理1. 偏向锁的原理2. 偏向锁的底层实现 2. 轻量级锁1. 轻量级锁的原理2. 轻量级锁的底层实现 3. 重量级锁1. 重量级锁的原理2. 重量级锁的底层实现 3. Java中锁升级的…

selenium +IntelliJ+firefox/chrome 环境全套搭配

1第一步&#xff1a;下载IntelliJ idea 代码编辑器 2第二步&#xff1a;下载浏览器Chrome 3第三步&#xff1a;下载JDK 4第四步&#xff1a;配置环境变量&#xff08;1JAVA_HOME 2 path&#xff09; 5第五步&#xff1a;下载Maven 6第六步&#xff1a;配置环境变量&#x…