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();}}
}

这是我第一次除了做题之外做出的有用的东西了!!!
虽然都是照着视频学习照搬的,但是也是第一次对做这些有那么一点小感悟和经历了!

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

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

相关文章

CMake+QT+大漠插件的桌面应用开发

文章目录 CMakeQT大漠插件的桌面应用开发简介环境项目结构配置编译环境代码 CMakeQT大漠插件的桌面应用开发 简介 在CMake大漠插件的应用开发——处理dm.dll&#xff0c;免注册调用大漠插件中已经说明了如何免注册调用大漠插件&#xff0c;以及做了几个简单的功能调用&#x…

【STM32】STM32学习笔记-USART串口收发HEX和文本数据包(29)

00. 目录 文章目录 00. 目录01. 串口简介02. 串口收发HEX数据包接线图03. 串口收发HEX数据包示例104. 串口收发HEX数据包示例205. 串口收发文本数据包接线图06. 串口收发文本数据包示例07. 程序示例下载08. 附录 01. 串口简介 串口通讯(Serial Communication)是一种设备间非常…

科研绘图(五)玫瑰图

柱状图的高级平替可视化 “玫瑰图”&#xff0c;通常也被称为“科克斯图”。它类似于饼图&#xff0c;但不同之处在于每个部分&#xff08;或“花瓣”&#xff09;的角度相同&#xff0c;半径根据它表示的值而变化。这种可视化工具对于周期性地显示信息非常有用&#xff0c;比…

Spring Boot 中批量执行 SQL 脚本的实践

在Spring Boot应用中&#xff0c;有时候我们需要批量执行存储在数据库中的 SQL 脚本。本文将介绍一个实际的案例&#xff0c;演示如何通过 Spring Boot、MyBatis 和数据库来实现这一目标。 0、数据库层 CREATE TABLE batchUpdate (id INT AUTO_INCREMENT PRIMARY KEY,update_…

TCP连接TIME_WAIT

TCP断开过程: TIME_WAIT的作用: TIME_WAIT状态存在的理由&#xff1a; 1&#xff09;可靠地实现TCP全双工连接的终止 在进行关闭连接四次挥手协议时&#xff0c;最后的ACK是由主动关闭端发出的&#xff0c;如果这个最终的ACK丢失&#xff0c;服务器将重发最终的FIN&#xf…

CSS3中多列布局详解

多列布局 概念&#xff1a;在CSS3之前&#xff0c;想要设计类似报纸那样的多列布局&#xff0c;有两种方式可以实现&#xff1a;一种是"浮动布局"&#xff0c;另一种是“定位布局”。 这两种方式都有缺点&#xff1a;浮动布局比较灵活&#xff0c;但不容易控制&…

用Python“自动连发消息”

自动连发消息&#xff0c;基本上C和Python的思路都是不停的模拟“击键”操作&#xff0c;还有一种VB的脚本写法&#xff0c;反成每种语言都能写&#xff0c;更厉害的可以用java做出个GUI界面&#xff0c;先上代码。 一 代码 import pyautogui # 鼠标 import p…

C++力扣题目101--对称二叉树

101. 对称二叉树 力扣题目链接(opens new window) 给定一个二叉树&#xff0c;检查它是否是镜像对称的。 思路 首先想清楚&#xff0c;判断对称二叉树要比较的是哪两个节点&#xff0c;要比较的可不是左右节点&#xff01; 对于二叉树是否对称&#xff0c;要比较的是根节点…

Linux命令之用户账户管理whoami,useradd,passwd,chage,usermod,userdel的使用

1、查看当前用户账户 2、切换用户为root用户 3、新建用户user1&#xff0c;给用户user1设置密码为password123 4、新建用户user2&#xff0c;UID为510&#xff0c;指定其所属的私有组为group1&#xff08;group1组的标识符为500&#xff09;&#xff0c;用户的主目录为/home/us…

codesys【程序】

FB&#xff1a; 用于实现 PLC【叠】PLC FB功能块&#xff1a; 包含 输入&#xff0c;输出&#xff0c;局部变量&#xff0c;静态变量 用ST语言&#xff0c;方便复制。FUNCTION_BLOCK FB_CAN轴 VAR_INPUT 输入 END_VAR VAR_OUTPUT 输出 END_VAR VAR …

【MATLAB源码-第110期】基于matlab的哈里斯鹰优化算发(HHO)无人机三维路径规划,输出做短路径图和适应度曲线。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 哈里斯鹰优化算法&#xff08;Harris Hawk Optimization, HHO&#xff09;是一种受自然界捕食行为启发的优化算法。它基于哈里斯鹰的捕猎策略和行为模式&#xff0c;主要用于解决各种复杂的优化问题。这个算法的核心特征在于…

vue3-列表渲染

v-for 我们可以使用 v-for 指令基于一个数组来渲染一个列表。 v-for 指令的值需要使用 (item in items) 形式的特殊语法&#xff0c;其中 items 是源数据的数组&#xff0c;而 item 是迭代项的别名&#xff0c; (item, index) in items index 表示当前项的位置索引(可选参数)…

深度学习-标注文件处理(txt批量转换为json文件)

接上篇&#xff0c;根据脚本可将coco128的128张图片&#xff0c;按照比例划分成训练集、测试集、验证集&#xff0c;同时生成相应的标注的labels文件夹&#xff0c;最近再看实例分离比较火的mask rcnn模型&#xff0c;准备进行调试但由于实验室算力不足&#xff0c;网上自己租的…

JVM知识总结(持续更新)

这里写目录标题 java内存区域程序计数器虚拟机栈本地方法栈堆方法区运行时常量池 对象的创建 java内存区域 Java 虚拟机在执行 Java 程序的过程中会把它管理的内存划分成若干个不同的数据区域&#xff1a; 程序计数器虚拟机栈本地方法栈堆方法区 程序计数器 记录下一条需要…

【ArcGIS遇上Python】ArcGIS Python批量筛选多个shp中指定字段值的图斑(以土地利用数据为例)

文章目录 一、案例分析二、提取效果二、代码运行效果三、Python代码四、数据及代码下载一、案例分析 以土地利用数据为例,提取多个shp数据中的旱地。 二、提取效果 原始土地利用数据: 属性表: 提取的旱地:(以图层名称+地类名称命名)

基于python舆情分析可视化系统+情感分析+爬虫+机器学习(源码)✅

大数据毕业设计&#xff1a;Python招聘数据采集分析可视化系统✅ 毕业设计&#xff1a;2023-2024年计算机专业毕业设计选题汇总&#xff08;建议收藏&#xff09; 毕业设计&#xff1a;2023-2024年最新最全计算机专业毕设选题推荐汇总 &#x1f345;感兴趣的可以先收藏起来&…

Python 自学(八) 之模块

目录 1. import语句导入模块 P206 2. from ... import 语句导入模块 P207 3. 模块的搜索目录 sys.path P209 4. 以主程序的形式执行 __name__ P212 5. python中的包 P213 1. import语句导入模块 P206 同一目录下&…

响应式Web开发项目教程(HTML5+CSS3+Bootstrap)第2版 第1章 HTML5+CSS3初体验 项目1-1 三栏布局页面

项目展示 三栏布局是一种常用的网页布局结构。 除了头部区域、底部区域外&#xff0c;中间的区域&#xff08;主体区域&#xff09;划分成了三个栏目&#xff0c;分别是左侧边栏、内容区域和右侧边栏&#xff0c;这三个栏目就构成了三栏布局。当浏览器的宽度发声变化时&#x…

【java八股文】之JVM基础篇

【java八股文】之JVM基础篇-CSDN博客 【java八股文】之MYSQL基础篇-CSDN博客 【java八股文】之Redis基础篇-CSDN博客 【java八股文】之Spring系列篇-CSDN博客 【java八股文】之分布式系列篇-CSDN博客 【java八股文】之多线程篇-CSDN博客 【java八股文】之JVM基础篇-CSDN博…

设计模式-委托模式

设计模式专栏 模式介绍模式特点应用场景委托模式在GUI编程场景的应用代码示例Java实现委托模式Python实现委托模式 委托模式在spring中的应用 模式介绍 委托模式是一种软件设计模式&#xff0c;其中一个对象&#xff08;委托对象&#xff09;将某些操作委托给另一个对象&#…