如何通过rust实现自己的web登录图片验证码
在进行web系统开发时,为保障系统登录安全,登录页面中的验证码必不可少。在java中,我们可以利用相应的2D图像库快速生成图形验证码,而对于rust,我们没有合适的标准库进行图像验证码的生成。今天,我们通过使用image crate,通过rust生成图像验证码。
一、加入依赖
我们通过cargo,在我们的项目中引入image依赖。

我们查看项目中的Cargo.toml文件,可以看到我们加入了image crate依赖。
[package]
name = "app-web1"
version = "0.1.0"
edition = "2021"[dependencies]
actix-files = "0.6.6"
actix-web = "4.9.0"
captcha = "0.0.9"
image = "0.25.5"
oracle = "0.6.3"
rand = "0.9.0"
serde = "1.0.218"
二、生成纯色图片
通过代码生成一个长80,高25的纯色图片。
let img2 = RgbImage::from_pixel(80, 25, Rgb([226,226,240]));img2.save("codeimage.jpg").expect("jpg save failed");
我们查看生成的图片信息:

我们再通过代码生成四分之一长,高度也为25的纯色图片,用来存储我们的验证字母和数字。
let img2 = RgbImage::from_pixel(20, 25, Rgb([226,226,240]));img2.save("A.jpg").expect("jpg save failed");
三、编辑验证图片
通过翻阅image crate的依赖库,尚未发现直接在图片中写入文字的方法,故本人通过手工添加26个字符和10个数字的方式,完成随机字母和数字图片的编辑。

四,随机函数编写
我们通过编写一个随机获取我们指定字符的函数,为后续随机生成验证图片提供支持。
fn ge_code_char()-> char{let mut rng = rand::rng();let s = "ABCDEFGHJKLMNPRSTUVWXYZ0123456789";s.chars().choose(&mut rng).unwrap()
}
五,生成验证码图片
我们通过循环获取验证字符,并通过拼接字符图片到我们的验证码图片,最终生成我们需要的验证码图片。
pub fn ge_code_img(){//生成一个宽度为70,高为25的颜色为Rgb([226,226,240]的图像,并保存为文件let mut img2 = RgbImage::from_pixel(80, 25, Rgb([226,226,240]));for i in 0..4{let c = ge_code_char();let cp = c.to_string()+".jpg";let img3 = ImageReader::open(cp).expect("open A.jpg failed").decode().expect("decode failed");img2.copy_from(&(img3.to_rgb8()), i*20, 0).expect("copy from sub img failed!");}img2.save("codeimage.jpg").expect("jpg save failed");
}
我们运行函数,验证随机验证码图片是否生成:
第一次:

第二次:

至此,我们的图片验证码程序完成!
相关文章:
如何通过rust实现自己的web登录图片验证码
在进行web系统开发时,为保障系统登录安全,登录页面中的验证码必不可少。在java中,我们可以利用相应的2D图像库快速生成图形验证码,而对于rust,我们没有合适的标准库进行图像验证码的生成。今天,我们通过使用…...
盛京开源社区加入 GitCode,书写东北开源生态新篇章
在数字化转型与开源技术蓬勃发展的浪潮下,开源社区已成为推动技术创新的核心力量。盛京开源社区(SJOSC)作为沈阳地区的开源交流平台,始终致力于连接开发者、企业及高校,构建区域技术生态圈。 现在,盛京开源…...
QKV 注意力机制在Transformer架构中的作用,和卷积在卷积神经网络中的地位,有哪些相似之处?
QKV 注意力机制在Transformer架构中的作用,和卷积在卷积神经网络中的地位,有哪些相似之处? QKV(Query-Key-Value)注意力机制在Transformer架构和卷积在卷积神经网络(CNN)中都起着核心作用&…...
高效与高并发API开发:使用FastAPI与Redis实现请求限制与速率控制
高效与高并发API开发:使用FastAPI与Redis实现请求限制与速率控制 📚 目录 API速率限制的基本概念Redis实现分布式速率限制防止DDoS攻击的常见策略基于IP或用户身份的访问频率控制 1. API速率限制的基本概念 API速率限制(Rate Limiting&…...
Centos7源码编译安装Sqlite最新版本
下载源码 https://www.sqlite.org/download.html 复制下载链接,然后用 wget 下载 wget https://www.sqlite.org/2025/sqlite-autoconf-3490100.tar.gz 解压缩编译安装 tar -zxf sqlite-autoconf-3490100.tar.gz cd sqlite-autoconf-3490100 ./configure --prefi…...
mybatis热点面试题第五弹
1. MyBatis与Hibernate的区别 答案: MyBatis: 不完全是一个ORM框架,需要手动编写SQL语句,灵活性高,适合对数据库操作有高性能要求的场景。缺点是无法做到数据库无关性,如果需要支持多种数据库,…...
KTransformers部署 使671B DeepSeek R1成「办公桌标配」
671B DeepSeek R1成「办公桌标配」 1. 什么是KTransformersDeepSeek 版本技术破局密钥:强稀疏化MoE模型需要全新的私有化架构设计趋境AI大模型推理软硬一体工作站——让大模型推理门槛降低10倍 2. 准备环境3 环境准备与资源下载4 安装过程1. linux环境搭建2. window…...
sql-labs less5-8
Less-5 双注入 基于单引号的字符型注入,涉及二次查询注入 Less-6 双注入 基于双引号的字符型注入,涉及二次查询注入 Less-7 字符型注入 基于单引号变形注入之导入文件 Less-8 布尔盲注 不返回任何错误信息,通过布尔逻辑判断 以下…...
一个大型应用的云原生一般有多少个服务?
DeepSeek R1 思考 1 秒 思考过程 在云原生架构中,大型应用的服务规模呈现动态分布特征。根据行业实践和架构模式分析,服务划分的核心考量维度包括: 一、业务领域驱动划分 核心业务服务群(通常15-30个) 用户中心&…...
Linux下安装VS Code
Centos 7 https://blog.csdn.net/weixin_63790642/article/details/132927888 安装存储库 sudo rpm --import https://packages.microsoft.com/keys/microsoft.asc密钥 sudo sh -c echo -e "[code]\nnameVisual Studio Code\nbaseurlhttps://packages.microsoft.com/yum…...
【零基础到精通Java合集】第一集:Java开发环境搭建
以下是针对**“Java开发环境搭建”**的15分钟课程内容设计,包含知识点拆分、实操演示与互动练习: 课程标题:Java开发环境搭建(15分钟) 目标:完成JDK安装、IDE配置并运行第一个Java程序 一、课程内容与时间分配 0-2分钟 课程目标与前置准备 明确学习目标:JDK安装、环境…...
Rocky Linux 系统安装 typecho 个人博客系统(Docker 方式)
typecho 博客系统安装 官网: https://typecho.org/ 1. 安装 Docker curl https://download.docker.com/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker.repo && yum install docker-ce -y && docker -v && systemctl enable --now docker…...
C++-第二十一章:特殊类设计
目录 第一节:特殊类 1-1.不能被拷贝的类 1-2.只能在堆上构造的类 1-3.只能在栈上构造的类 1-4.只能构造一个对象的类 第二节:工厂模式 下期预告: 第一节:特殊类 1-1.不能被拷贝的类 不能被拷贝的类有线程类、std::unique_ptr、…...
pytorch 模型测试
在使用 PyTorch 进行模型测试时,一般包含加载测试数据、加载训练好的模型、进行推理以及评估模型性能等步骤。以下为你详细介绍每个步骤及对应的代码示例。 1. 导入必要的库 import torch import torch.nn as nn import torchvision import torchvision.transforms as trans…...
在kali linux中kafka的配置和使用
官方文档 一、安装依赖 删除原有的jdk sudo apt remove --purge openjdk-\* sudo apt clean安装 Java (JDK 11) sudo apt install openjdk-11-jdk -y # 验证安装 java -version二、下载并解压 Kafka 下载 Kafka wget https://dlcdn.apache.org/kafka/3.9.0/kafka_2.13-3.9.0.t…...
代码规范和简化标准
代码规范和简化标准是编写高质量、可维护、可扩展和可读代码的基本原则。遵循这些标准不仅能提高团队协作效率,还能减少出错的概率和后期维护的成本。以下是一些常见的代码规范和简化标准: 1. 命名规范 变量命名: 使用具有描述性的名称&…...
基于SpringBoot的校园二手交易平台(源码+论文+部署教程)
运行环境 校园二手交易平台运行环境如下: • 前端:Vue • 后端:Java • IDE工具:IntelliJ IDEA(可自行更换) • 技术栈:SpringBoot Vue MySQL 主要功能 校园二手交易平台主要包含前台和…...
【51单片机】快速入门
动手实践 > 理论空谈!从点亮LED开始,逐步扩展功能,2周可入门基础。 一、51单片机基础概念 什么是51单片机? 基于Intel 8051架构的8位微控制器,广泛用于嵌入式开发。 核心特性:4KB ROM、128B RAM、32个…...
YOLOv8+QT搭建目标检测项目
2024年7月YOLOv8QT初步搭建目标检测(避坑)_qt yolov8-CSDN博客YOLOv8QT初步搭建目标检测 2024年7月YOLOv8QT初步搭建目标检测(避坑)_qt yolov8-CSDN博客 yolov8的可视化界面(一、可视化界面设计)_yolo 可…...
刷题记录10
力扣72. 编辑距离 给你两个单词 word1 和 word2, 请返回将 word1 转换成 word2 所使用的最少操作数 。 你可以对一个单词进行如下三种操作: 插入一个字符删除一个字符替换一个字符 解题思路: 本题与583. 两个字符串的删除操作其实是一样…...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
数据链路层的主要功能是什么
数据链路层(OSI模型第2层)的核心功能是在相邻网络节点(如交换机、主机)间提供可靠的数据帧传输服务,主要职责包括: 🔑 核心功能详解: 帧封装与解封装 封装: 将网络层下发…...
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...
LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》
这段 Python 代码是一个完整的 知识库数据库操作模块,用于对本地知识库系统中的知识库进行增删改查(CRUD)操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 📘 一、整体功能概述 该模块…...
Unity UGUI Button事件流程
场景结构 测试代码 public class TestBtn : MonoBehaviour {void Start(){var btn GetComponent<Button>();btn.onClick.AddListener(OnClick);}private void OnClick(){Debug.Log("666");}}当添加事件时 // 实例化一个ButtonClickedEvent的事件 [Formerl…...
【前端异常】JavaScript错误处理:分析 Uncaught (in promise) error
在前端开发中,JavaScript 异常是不可避免的。随着现代前端应用越来越多地使用异步操作(如 Promise、async/await 等),开发者常常会遇到 Uncaught (in promise) error 错误。这个错误是由于未正确处理 Promise 的拒绝(r…...
libfmt: 现代C++的格式化工具库介绍与酷炫功能
libfmt: 现代C的格式化工具库介绍与酷炫功能 libfmt 是一个开源的C格式化库,提供了高效、安全的文本格式化功能,是C20中引入的std::format的基础实现。它比传统的printf和iostream更安全、更灵活、性能更好。 基本介绍 主要特点 类型安全:…...
【51单片机】4. 模块化编程与LCD1602Debug
1. 什么是模块化编程 传统编程会将所有函数放在main.c中,如果使用的模块多,一个文件内会有很多代码,不利于组织和管理 模块化编程则是将各个模块的代码放在不同的.c文件里,在.h文件里提供外部可调用函数声明,其他.c文…...
