当前位置: 首页 > news >正文

Springboot项目的行为验证码AJ-Captcha(源码解读)

目录

  • 前言
  • 1. 复用验证码
  • 2. 源码解读
    • 2.1 先走DefaultCaptchaServiceImpl类
    • 2.2 核心ClickWordCaptchaServiceImpl类
  • 3. 具体使用

前言

对于Java的基本知识推荐阅读:

  1. java框架 零基础从入门到精通的学习路线 附开源项目面经等(超全)
  2. 【Java项目】实战CRUD的功能整理(持续更新)

对于源码可以直接使用:anji-plus/AJ-Captcha

1. 复用验证码

在这里插入图片描述

下载源码之后,配置好Maven项目,直接启用Springboot的项目

在这里插入图片描述

对应修改前端的启动网址配置:

在这里插入图片描述

最终截图如下:

在这里插入图片描述

2. 源码解读

通过断点,具体走一遍完整逻辑

在这里插入图片描述

具体请求地址走向如下:

在这里插入图片描述

对应check中的Service类:ResponseModel check(CaptchaVO captchaVO);
先跳入DefaultCaptchaServiceImpl类:
在这里插入图片描述

之后检查相应的类型:(校验传入的CaptchaVO对象,并根据验证码类型调用相应的服务进行验证)

在这里插入图片描述

从CaptchaServiceFactory中获取对应验证码类型的服务实例

在这里插入图片描述

单看它的工厂类:

在这里插入图片描述

  1. 使用ServiceLoader动态加载所有实现了CaptchaCacheService和CaptchaService接口的类
  2. 将加载到的服务实例存储在cacheService和instances这两个Map中,键为各自服务的类型(由type()或captchaType()方法返回)
  3. 记录日志,输出支持的验证码缓存服务和验证码类型服务

总体就是map的实例化对象,通过key value

2.1 先走DefaultCaptchaServiceImpl类

基本的配置类主要由两个大配置类组成

在这里插入图片描述

对应的配置类走向设置:

在这里插入图片描述

配置类配置默认值:

在这里插入图片描述

对应的参数如下:

在这里插入图片描述

但是我的默认值不是DefaultCaptchaServiceImpl么,对应只需要在源码中再次设置即可

在这里插入图片描述

2.2 核心ClickWordCaptchaServiceImpl类

实现了验证码的初始化、生成、校验和验证等功能

  1. 读取配置:从配置文件中读取字体类型、字体大小等配置
  2. 初始化字体:根据配置文件中指定的字体类型和大小,初始化字体对象
  3. 异常处理:如果字体加载失败,记录错误日志

在这里插入图片描述

  1. 生成图片:调用ImageUtils.getPicClick()生成点击验证码图片
  2. 检查图片有效性:如果图片未初始化成功或获取的图片数据无效,返回错误信息
  3. 返回结果:将生成的图片数据返回给前端

在这里插入图片描述

  1. 获取缓存中的验证码数据:从缓存中获取验证码对应的坐标信息,并删除缓存记录。
  2. 解析坐标数据:将坐标信息进行解密并解析成坐标对象。
  3. 验证坐标信息:检查用户点击的坐标是否与生成验证码时的坐标匹配。
  4. 异常处理:如果解析失败或坐标不匹配,返回错误信息。
  5. 成功处理:将验证成功的信息存入缓存,并返回成功结果

在这里插入图片描述

总体就是:

  • 初始化:从配置文件中读取字体和其他配置信息,初始化验证码生成所需的资源
  • 生成验证码:生成点击文字验证码图片,并返回给前端
  • 校验验证码:从缓存中获取验证码的坐标信息,解析并验证用户点击的坐标是否正确
  • 验证验证码:二次验证时,从缓存中获取并验证验证码信息,确保验证码的唯一性和时效性

3. 具体使用

由于自身的项目使用已经引入,大致细节如下:

可结合他人教程阅读:行为验证码(AJ-Captcha快速入门)

引入依赖包:

<!--验证码-->
<dependency><groupId>com.github.anji-plus</groupId><artifactId>captcha-spring-boot-starter</artifactId><version>1.2.7</version>
</dependency>

默认依赖就存在 CaptchaController类,可以不用写

只需复制前端所有内容即可

如果需要重写对应的后端,关键内容是

在这里插入图片描述

还有图片的导入以及路径的修改:

在这里插入图片描述

再次解读下这个方法:

public static final String getRemoteId(HttpServletRequest request) {String xfwd = request.getHeader("X-Forwarded-For");String ip = getRemoteIpFromXfwd(xfwd);String ua = request.getHeader("user-agent");if (StringUtils.isNotBlank(ip)) {return ip + ua;}return request.getRemoteAddr() + ua;}

getRemoteId 方法负责拼接客户端的 IP 地址和用户代理(User-Agent)信息

这些信息将用于生成或校验验证码时的上下文信息,以增加验证码的安全性

相关文章:

  • cpp程序设计实践,类实现树链刨分以及计算几何类
  • ASP.NET中的六大对象有哪些?以及各自的功能以及使用方式
  • Android中systrace配置及注意问题
  • 面试题012-数据库-MySQL(日志+优化)
  • 开始尝试从0写一个项目--前端(三)
  • 学习华为IPD流程黑话2.0
  • Intel12代处理器在虚拟机中安装Windows98SE
  • Linux基础复习(三)
  • 云服务器Ubuntu18.04进行Nginx配置
  • 0722_驱动3 地址映射驱动点灯
  • VScode 自定义插件安装目录
  • 03。正式拿捏ArkTS语言第一天
  • 重生之“我打数据结构,真的假的?”--3.栈和队列
  • Opencv学习项目4——手部跟踪
  • 【机器学习】解开反向传播算法的奥秘
  • CSS居中完全指南——构建CSS居中决策树
  • github从入门到放弃(1)
  • Java超时控制的实现
  • Laravel深入学习6 - 应用体系结构:解耦事件处理器
  • leetcode98. Validate Binary Search Tree
  • Linux学习笔记6-使用fdisk进行磁盘管理
  • Netty+SpringBoot+FastDFS+Html5实现聊天App(六)
  • Python_网络编程
  • Python语法速览与机器学习开发环境搭建
  • quasar-framework cnodejs社区
  • RxJS 实现摩斯密码(Morse) 【内附脑图】
  • sessionStorage和localStorage
  • 闭包,sync使用细节
  • 程序员最讨厌的9句话,你可有补充?
  • 关于List、List?、ListObject的区别
  • 快速体验 Sentinel 集群限流功能,只需简单几步
  • 两列自适应布局方案整理
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • 想使用 MongoDB ,你应该了解这8个方面!
  • 一份游戏开发学习路线
  • 走向全栈之MongoDB的使用
  • 【运维趟坑回忆录】vpc迁移 - 吃螃蟹之路
  • zabbix3.2监控linux磁盘IO
  • 移动端高清、多屏适配方案
  • #define用法
  • ()、[]、{}、(())、[[]]命令替换
  • (1)Jupyter Notebook 下载及安装
  • (C++二叉树05) 合并二叉树 二叉搜索树中的搜索 验证二叉搜索树
  • (LeetCode) T14. Longest Common Prefix
  • (八)Spring源码解析:Spring MVC
  • (差分)胡桃爱原石
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (附源码)ssm捐赠救助系统 毕业设计 060945
  • (个人笔记质量不佳)SQL 左连接、右连接、内连接的区别
  • (回溯) LeetCode 77. 组合
  • (一)插入排序
  • ****三次握手和四次挥手
  • .NET CORE使用Redis分布式锁续命(续期)问题
  • .NET HttpWebRequest、WebClient、HttpClient
  • .NET/ASP.NETMVC 大型站点架构设计—迁移Model元数据设置项(自定义元数据提供程序)...