Java生成四位数随机验证码
引言:
我们生活中登录的时候都要输入验证码,这些验证码是为了增加注册或者登录难度,减少被人用脚本疯狂登录注册导致的一系列危害,减少数据库的一些压力。
毕竟那些用脚本生成的账号都是垃圾账号
本次实践:生成这样的验证码

并且附带一些干扰线
项目想法:
我们生成一个验证码有好几个要求
1.验证码必须是随机的,每次都不能重复出现一模一样的
2.验证码得让人有体验感,最起码得看得清,大小要合适
3.验证码初步需要一些干扰线,防止很轻易的就被脚本识别出来。
初步学习先以这些为要求进行实践。
项目思路:
我们要理解这个验证码的生成过程。
1.我们需要有一个画板
2.我们需要一只笔可以在画板上涂鸦
3.我们需要用笔在画板上画字符
4.我们需要调节画板和字符的颜色,及其大小,提升体验感
5.我们需要画出干扰线
项目实践:
1.我们需要一些字母或者数字,这样组成随机的四位验证码
我们可以写一个程序快速生成这样的数组
public class Zifu {public static void main(String[] args) {for(int i=0; i<26; i++){char ch = (char) ('a' + i); // 生成字母if (i != 25) {System.out.print("\"" + ch + "\", ");} else {System.out.print("\"" + ch + "\"");} }for(int i=0; i<10; i++){char ch=(char)('0'+i);if (i != 9) {System.out.print("\"" + ch + "\", ");} else {System.out.print("\"" + ch + "\"");} }for(int i=0; i<26; i++){char ch = (char) ('A' + i); // 生成字母if (i != 25) {System.out.print("\"" + ch + "\", ");} else {System.out.print("\"" + ch + "\"");} }}
}
输出为:
然后我们将其复制粘贴在静态数组里面
这样我们就准备好我们所需要的数组了
2.怎样画图
画图的思路是:
1.准备画板
2.准备笔
3.然后笔在画板上画
如何准备画板?
先导入相关包,画板有专门的类是BufferedImage
笔相关的包是,Graphics
3.创建画板
创建画板要先实例化一个画板,然后补充宽高和组成
int height=200;//高int width=400;//宽int imageType = BufferedImage.TYPE_INT_RGB;//画板的组成,rgb是red,green,blue,红绿蓝组成BufferedImage image = new BufferedImage(width,height,imageType);//实例化画板对象,三个参数

代码运行后生成的jpg文件
4.生成随机验证码
这里需要用到random模块
r是实例化Random的对象,r.newInt(界限),可以帮我们生成0到界限-1之间的随机数值,我们可以通过它去随机选取字符数组的下标

生成的效果图为
5.生成干扰线
干扰线原理其实与生成字符一样
生成的重要代码是g.drawLine(x1,y1,x2,y2);
意思是两个点(x1,y1),(x2,y2)之间画条直线

生成的效果图为:

本次项目的小知识点
1.画板有java自带的BufferedImage,我们只需要导包就好了
2.笔有java自带的Graphice,也是只要导包就好了
3.画字符的时候字符的位置以及横坐标偏移,如果不偏移两次画在同一个地方就会覆盖掉
4.字符的颜色,字体可以通过Font去设置
5.最后就是将画出的图生成在本地了
tips:最好的方法就是每做出一步就把图生成在本地查看情况然后根据需求进行调整,我上面的步骤就是一步一步来的。
本次验证码生成的整体代码如下:
文件路径我就删了,需要的朋友们自己补充吧,随便找个空的文件夹然后复制地址就好了
格式是这样的:
tips:为什么我用的都是\\,因为如果是单斜杠的话我的vscode会识别为转义字符,所以都用双斜杠了\\
整体代码如下:
import java.awt.Color; // 引入 Color 类,提供系统颜色和关于颜色空间的类。
import java.awt.Font; // 引入 Font 类,支持在AWT的所有渲染环境下的通用文字布局,并为所有给定字符和脚本提供字体处理功能。
import java.awt.Graphics; // 引入 Graphics 类,允许应用程序以协同的方式绘制到屏幕上或者其他任何地方。
import java.awt.image.BufferedImage; // 引入 BufferedImage 类,描述一些整数像素的具有可访问的数据缓冲区的图像。
import java.io.File; // 引入 File 类,它提供了与文件和路径名相关的操作,它具有创建、删除、读取文件等功能。
import java.io.IOException; // 引入 IOException 类,处理输入、输出操作失败或中断的情况(类似于文件未找到等)。
import java.util.Random; // 引入 Random 类,用于生成伪随机数。
import javax.imageio.ImageIO; // 引入 ImageIO 类,用于读取和写入图像格式,如 JPEG、PNG等。public class checkimage {static String[] strs={"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z","0", "1", "2", "3", "4", "5", "6", "7", "8", "9","A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"};public static void main(String[] args) {int height=200;//高int width=400;//宽int imageType = BufferedImage.TYPE_INT_RGB;//画板的组成,rgb是red,green,blue,红绿蓝组成BufferedImage image = new BufferedImage(width,height,imageType);//实例化画板对象,三个参数Graphics g = image.getGraphics();//实例化了一支笔g.setColor(Color.white);//笔的颜色为白色g.fillRect(0, 0, width, height);//然后将画板填充为白色,x,y为矩形左上角的坐标/*设置画板 */Random r=new Random();//实例化一个随机的对象int x=25,y=125;//这个是x,y界限g.setColor(Color.blue);//让验证码的颜色为蓝色g.setFont(new Font("宋体",Font.PLAIN,100));//设置字体,字体为宋体,并且大小为100for(int i=0;i<4;i++){//用for循环生成4个随机验证码int index=r.nextInt(62);//strs数组总共62个数,所以下标界限是0-61String str=strs[index];//随机取一个字符g.drawString(str, x, y);//画字符在画板上x+=100;//这个移位,不然我第一次在这个位置画A,第二次画B的时候还在这个位置不就覆盖掉了吗,所以要移动位置}/*画出四位数的验证码 */g.setColor(Color.green);//让画笔的颜色为绿色for(int i=0;i<10;i++){//生成十条干扰线int a=r.nextInt(10);int b=r.nextInt(400);int c=r.nextInt(10)+380;int d=r.nextInt(400);g.drawLine(a,b,c,d);//ab是干扰线的左边的横纵坐标,cd是右边的} /*画出干扰线 */// 尝试写入图像try {ImageIO.write(image, "jpg", new File("C:\\Users\\Desktop\\项目学习\\myImage.jpg")); //此处应给出具体的文件名} catch (IOException e) {e.printStackTrace();}}
}
这是我第一次除了做题之外做出的有用的东西了!!!
虽然都是照着视频学习照搬的,但是也是第一次对做这些有那么一点小感悟和经历了!
相关文章:
Java生成四位数随机验证码
引言: 我们生活中登录的时候都要输入验证码,这些验证码是为了增加注册或者登录难度,减少被人用脚本疯狂登录注册导致的一系列危害,减少数据库的一些压力。 毕竟那些用脚本生成的账号都是垃圾账号 本次实践:生成这样的…...
编程探秘:Python深渊之旅-----数据可视化(八)
客户提出了对数据报告和图表的具体要求,这使得团队需要快速掌握数据可视化的技巧。派超决定深入了解 Python 中的数据可视化工具。 派超(兴奋地):我们有机会做些真正酷炫的数据报告了!我听说 Python 有很棒的图表库。…...
上海亚商投顾:创业板指冲高回落 光伏、航运股逆势走强
上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。 一.市场情绪 沪指1月12日冲高回落,创业板指午后跌近1%。北证50指数跌超6%,倍益康、华信永道、众诚科…...
Python3 中常用字符串函数介绍
介绍 Python 中有几个与 字符串数据类型相关的内置函数。这些函数让我们能够轻松修改和操作字符串。我们可以将函数视为在代码元素上执行的操作。内置函数是在 Python 编程语言中定义的,并且可以随时供我们使用的函数。 在本教程中,我们将介绍在 Pytho…...
Python - 深夜数据结构与算法之 AVL 树 红黑树
目录 一.引言 二.高级树的简介 1.树 2.二叉树 3.二叉搜索树 4.平衡二叉树 三.AVL 树 ◆ 插入节点 ◆ 左旋 ◆ 右旋 ◆ 左右旋 ◆ 右左旋 ◆ 一般形式 ◆ 实际操作 ◆ 总结 四.红黑树 ◆ 概念 ◆ 示例 ◆ 对比 五.总结 一.引言 前面我们介绍了二叉树、二叉…...
Zookeeper使用详解
介绍 ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布…...
C#属性(Property)
文章目录 一、C#属性(Property)?二、属性的用法总结 一、C#属性(Property)? C#属性(Property)是一种访问器(accessor),用于封装一个类的字段&…...
在docker中搭建部署clickhouse
因需要给网关日志拉取并存储供数据分析师分析,由于几十个项目的网关请求数量很大,放在mysql不合适,MongoDB不适合分析,于是准备存放在clickhouse,clickhouse对于读写支持也比较友好,说干就干 1、在服务器中…...
第九部分 使用函数 (三)
目录 一、文件名操作函数 1、dir 2、notdir 3、suffix 4、basename 5、addsuffix 6、addprefix 7、join 一、文件名操作函数 下面我们要介绍的函数主要是处理文件名的。每个函数的参数字符串都会被当做一个或是 一系列的文件名来对待。 1、dir $(dir <names..>…...
基础命令继续
1:创建目录命令 mkdir命令 注意:创建文件夹需要修改权限,请确保操作均在HOME目录内,不要在Home外操作,涉及到权限问题,HOME外无法识别 小结: 练习: 2:touch创建文件 2:c…...
uni-app做A-Z排序通讯录、索引列表
上图是效果图,三个问题 访问电话通讯录,拿数据拿到用户的联系人数组对象,之后根据A-Z排序根据字母索引快速搜索 首先说数据怎么拿 - 社区有指导https://ask.dcloud.net.cn/question/64117 uniapp 调取通讯录 // #ifdef APP-PLUSplus.contac…...
Codeforces Round 768 (Div. 1) D. Flipping Range(思维题 等价类性质 dp)
题目 思路来源 官方题解 洛谷题解 题解 可操作的最短区间长度肯定是gcd,记为g,然后考虑如何dp 考虑g个等价类,每个等价类i,ig,i2*g,... 每次翻转长度为g的区间,会同时影响到g个等价类总的翻转的奇偶性, 性质一&…...
springboot集成kafka消费数据
springboot集成kafka消费数据 文章目录 springboot集成kafka消费数据1.引入pom依赖2.添加配置文件2.1.添加KafkaConsumerConfig.java2.2.添加KafkaIotCustomProperties.java2.3.添加application.yml配置 3.消费者代码 1.引入pom依赖 <dependency><groupId>org.spri…...
单例模式---JAVA
目录 “饿汉”模式 完整代码 “懒汉”模式 完整代码 单例模式:保证某个类在程序中只存在唯一一份实例, 而不会创建出多个实例。 单例模式可以通过实例创建的时间来分为两种:“饿汉”和“懒汉”模式。 “饿汉”模式 所谓的“饿汉”模式实则就是在类…...
maven管理使用
maven基本使用 一、简介二、配置文件三、项目结构maven基本标签实践(例子) 四、pom插件配置五、热部署六、maven 外部手动加载jar打包方式Maven上传私服或者本地 一、简介 基于Ant 的构建工具,Ant 有的功能Maven 都有,额外添加了其他功能.本地仓库:计算机中一个文件夹,自己定义…...
如何在一个系统中同时访问异构的多种数据库
如何在一个系统中同时访问异构的多种数据库 比如在一个系统中,要同时访问MySQL,H2, MsAccess, Mongodb. 要是使用Hibernate, MyBatis这些ORM,难度简直不敢想像。 要是MySQL还使用了分库分表,那更加不得了,一大堆的组件都要配合着…...
半监督学习 - 半监督聚类(Semi-Supervised Clustering)
什么是机器学习 半监督聚类是一种集成了有标签数据和无标签数据的聚类方法,其目标是在聚类的过程中利用有标签数据的信息来提高聚类性能。在半监督聚类中,一部分数据集有已知的标签,而另一部分没有标签。 以下是半监督聚类的基本思想和一些…...
实现STM32烧写程序-(3) Hex文件结构
简介 要对STM32进行更新动作, 就需要对程序文件进行解析, 大部分编译的生成程序文件是Hex或者Bin, 先来看看Hex的结构吧。 资料 Hex文件 简介 Hex文件格式最早由Intel公司于1973年创建。它最初是为了在Intel 8080微处理器上存储和传输二进制数据而设计的。随后,Hex…...
精品量化公式——“区域突破”,应对当下行情较好的主图看盘策略
不多说,直接上效果如图: ► 日线表现 代码评估 技术指标代码评估: VAR1, VAR2, VAR3:这些变量是通过指数移动平均(EMA)计算得出的。EMA是一种常用的技术分析工具,用于平滑价格数据并减少市场“…...
自然语言处理5——发掘隐藏规律 - Python中的关联规则挖掘
目录 写在开头1. 了解关联规则挖掘的概念和实际应用1.1 关联规则挖掘在市场分析和购物篮分析中的应用1.2 关联规则的定义和基本原理1.3 应用场景2. 使用Apriori算法和FP-growth算法进行关联规则挖掘2.1 Apriori算法的工作原理和实现步骤2.2 FP-growth算法的优势和使用方法2.3 A…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序
一、开发准备 环境搭建: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 项目创建: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...
Matlab | matlab常用命令总结
常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...
自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...
【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...
学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...
Java + Spring Boot + Mybatis 实现批量插入
在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法:使用 MyBatis 的 <foreach> 标签和批处理模式(ExecutorType.BATCH)。 方法一:使用 XML 的 <foreach> 标签ÿ…...
