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

文章目录

  • 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-authuri: lb://ruoyi-authpredicates:- 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.mzph.cn/news/93130.shtml

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

相关文章

25-多线程

多线程 线程(Thread)是一个程序内部的一条执行流程。 程序中如果有一条执行流程,那这个程序就是单线程的程序 多线程是指从软硬件上实现的多条执行流程的技术(多条线程由CPU负责调度执行)。 再例如:消息通信、淘宝、京东系统都离…

【Flink】

事件驱动型应用 核心目标:数据流上的有状态计算 Apache Flink是一个框架和分布式处理引擎,用于对无界或有界数据流进行有状态计算。 运行逻辑 状态 把流处理需要的额外数据保存成一个“状态”,然后针对这条数据进行处理,并且更新状态。这就是所谓的“…

c# 中的类

反射 Activator.CreateInstance class Program {static void Main(string[] args){//反射Type t typeof(Student);object o Activator.CreateInstance(t, 1, "FJ");Student stu o as Student;Console.WriteLine(stu.Name);//动态编程dynamic stu2 Activator.Cre…

在 Windows 终端运行已有的 Python 程序

在同一个路径下,输入全名,如图:

【Spring Cloud】Ribbon 实现负载均衡的原理,策略以及饥饿加载

文章目录 前言一、什么是 Ribbon二、Ribbon 实现负载均衡的原理2.1 负载均衡的流程2.2 Ribbon 实现负载均衡的源码剖析 三、Ribbon 负载均衡策略3.1 负载均衡策略3.2 演示 Ribbon 负载均衡策略的更改 四、Ribbon 的饥饿加载4.1查看 Ribbon 的懒加载4.2 Ribbon 的饥饿加载模式 前…

开放式耳机怎么选择、300之内最好的耳机推荐

开放式耳机凭借不入耳、不伤耳、安全更舒适的佩戴体验,得到了越来越多音乐爱好者和专业人士的青睐。开放式耳机不需要插入耳道,在佩戴时可以更加自然和轻松,减少了长时间佩戴引起的不适感,而且不会完全隔绝外界声音,用…

【VIM】VIM配合使用的工具

6-1 课程总结-vim虐我千百遍,我待 vim 如初恋_哔哩哔哩_bilibili

Koa处理请求数据

在开发中,后端接收到请求参数后,需要解析参数。请求分为很多种类型,比如常见的get和post。 请求参数 Koa本身可以解析get请求参数,不能解析post请求参数。例如: router.get(/api/get/userInfo, async (context) >…

多目标平衡优化器黏菌算法(MOEOSMA)求解CEC2020多模式多目标优化

多目标平衡优化器黏菌算法(MOEOSMA)比现有的多目标黏菌算法具有更好的优化性能。在MOEOSMA中,动态系数用于调整勘探和开采趋势。采用精英存档机制来促进算法的收敛性。使用拥挤距离法来保持Pareto前沿的分布。采用平衡池策略模拟黏菌的协同觅…

手机号码格式校验:@PhoneQuery(作为查询参数)(自定义参数校验注解)

目标 自定义一个用于校验(作为查询参数的)手机号码格式的注解PhoneQuery,能够和现有的 Validation 兼容,使用方式和其他校验注解保持一致。 校验逻辑 可以为 null 或 空字符串;不能包含空格;必须为数字序…

编程前置:怎么知道一句话的重点?

怎么知道一句话的重点&#xff1f; <small> 之所以要这个问题&#xff0c;是因为① 对标题进行分词 ② 找到标题中的重点词 ③ 然后找到主题中唯一的词语 ④ 然后对这个词语进行绘图说和看&#x1f440;来看&#x1f440;去&#xff0c;也就是文字成图的步骤啦&#xff…

【Spring Cloud】基于 Feign 实现远程调用,深入探索 Feign 的自定义配置、性能优化以及最佳实践方案

前言 在微服务架构中&#xff0c;服务之间的通信是至关重要的&#xff0c;而远程调用则成为实现这种通信的一种常见方式。在 Java 中&#xff0c;使用 RestTemplate 是一种传统的远程调用方式&#xff0c;但它存在一些问题&#xff0c;如代码可读性差、编程体验不一致以及参数…

如何实现电脑语音输入功能?

现在的手机都具备语音输入功能&#xff0c;并且识别率非常高&#xff0c;语音输入是目前最快速的文字输入方式&#xff0c;但是电脑上却无语音输入的功能&#xff0c;那么如何实现在电脑端也可进行语音输入的梦想呢&#xff1f;现在介绍一款小工具“书剑电脑语音输入法”&#…

Codeforces Round 901 (Div. 1) B. Jellyfish and Math(思维题/bfs)

题目 t(t<1e5)组样例&#xff0c;每次给出a,b,c,d,m(0<a,b,c,d,m<2的30次方) 初始时&#xff0c;(x,y)(a,b)&#xff0c;每次操作&#xff0c;你可以执行以下四种操作之一 ①xx&y&#xff0c;&为与 ②xx|y&#xff0c;|为或 ③yx^y&#xff0c;^为异或 …

背包问题

目录 开端 01背包问题 AcWing 01背包问题 Luogu P2925干草出售 Luogu P1048采药 完全背包问题 AcWing 完全背包问题 Luogu P1853投资的最大效益 多重背包问题 AcWing 多重背包问题 I AcWing 多重背包问题 II Luogu P1776宝物筛选 混合背包问题 AcWing 混合背包问题…

QCefView 简介

什么是QCefView QCefView 是为 Qt 开发的一个封装集成了CEF(Chromium Embedded Framework)库的Wdiget UI组件。使用QCefView可以充分发挥CEF丰富强大的Web能力&#xff0c;快速开发混合架构的应用程序。它不需要开发者理解CEF的细节&#xff0c;能够在Qt中更容易的使用CEF&…

IDEA的使用

文章目录 1.IDEA配置1.1 idea界面说明1.2 git1.3 JDK1.4 maven1.5 Tomcat1.6 idea设置编码格式1.7 vscodenodejs1.8 windows下安装redis 2. IDEA问题2.1 setAttribute方法爆红2.2 idea cannot download sources解决办法2.3 springboot项目跑起来不停run 3. vscode3.1 vscode显示…

c++三大概念要分清--重载,隐藏(重定义),覆盖(重写)

目 录 一、重载 **&#xff08;1&#xff09;概念&#xff1a;**在同一个作用域内&#xff1b;函数名相同&#xff0c;参数列表不同&#xff08;参数个数不同&#xff0c;或者参数类型不同&#xff0c;或者参数个数和参数类型都不同&#xff09;&#xff0c;返回值类型可相同也…

uniapp项目实践总结(二十五)苹果 ios 平台 APP 打包教程

导语:当你的应用程序开发完成后,在上架 ios 应用商店之前,需要进行打包操作,下面就简单介绍一下打包方法。 目录 准备工作注册账号生成证书打包配置准备工作 在打包之前,请保证你的 uniapp 应用程序编译到 ios 模拟器或者是真机调试基座环境下是可以正常运行的,苹果打包…

input输入表头保存excel文件

input输入表头 input输入表头 &#xff08;input内除了/&#xff0c;空格 回车 标点符号等 全部作为单元格分隔符&#xff09;保存/storage/emulated/0/代码文件/ 没有就创建文件名命名方法&#xff1a;编号. 库 时间戳嗨&#xff01;听说你有个需求&#xff0c;想根据用户输入…