Java生成四位数随机验证码

news2024/11/18 19:54:32

引言:

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

本次实践:生成这样的验证码


并且附带一些干扰线

项目想法:

我们生成一个验证码有好几个要求

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));//设置字体,字体为宋体,并且大小为100
        for(int i=0;i<4;i++){//用for循环生成4个随机验证码
            int index=r.nextInt(62);//strs数组总共62个数,所以下标界限是0-61
            String 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.coloradmin.cn/o/1384843.html

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

相关文章

Spring Boot - 利用Resilience4j-RateLimiter进行流量控制和服务降级

文章目录 Resilience4j概述Resilience4j官方地址Resilience4j-RateLimiter微服务演示Payment processorPOM配置文件ServiceController Payment servicePOMModelServiceRestConfigController配置验证 探究 Rate Limiting请求三次 &#xff0c;观察等待15秒连续访问6次 Resilienc…

mysql原理--undo日志1

1.事务回滚的需求 我们说过 事务 需要保证 原子性 &#xff0c;也就是事务中的操作要么全部完成&#xff0c;要么什么也不做。但是偏偏有时候事务执行到一半会出现一些情况&#xff0c;比如&#xff1a; (1). 事务执行过程中可能遇到各种错误&#xff0c;比如服务器本身的错误&…

前端对接电子秤、扫码枪设备serialPort 串口使用教程

因为最近工作项目中用到了电子秤&#xff0c;需要对接电子秤设备。以前也没有对接过这种设备&#xff0c;当时也是一脸懵逼&#xff0c;脑袋空空。后来就去网上搜了一下前端怎么对接&#xff0c;然后就发现了SerialPort串口。 Serialport 官网地址&#xff1a;https://serialpo…

软件工程:黑盒测试等价分类法相关知识和多实例分析

目录 一、黑盒测试和等价分类法 1. 黑盒测试 2. 等价分类法 二、黑盒测试等价分类法实例分析 1. 工厂招工年龄测试 2. 规定电话号码测试 3. 八位微机测试 4. 三角形判断测试 一、黑盒测试和等价分类法 1. 黑盒测试 黑盒测试就是根据被测试程序功能来进行测试&#xf…

通过开源端点可见性改善网络安全响应

在当今复杂的数字环境中&#xff0c;企业内的许多不同端点&#xff08;从数据中心的服务器到咖啡店的笔记本电脑&#xff09;创建了巨大且多样化的攻击面。每个设备都存在网络安全威胁的机会&#xff0c;每个设备都有其独特的特征和复杂性。攻击者使用的多种攻击媒介不仅是一个…

【占用网络】FlashOcc:快速、易部署的占用预测模型

前言 FlashOcc是一个它只需2D卷积就能实现“占用预测模型”&#xff0c;具有快速、节约内存、易部署的特点。 它首先采用2D卷积提取图形信息&#xff0c;生成BEV特征。然后通过通道到高度变换&#xff0c;将BEV特征提升到3D空间特征。 对于常规的占用预测模型&#xff0c;将…

web前端算法简介之字典与哈希表

回顾 栈、队列 &#xff1a; 进、出 栈&#xff08;Stack&#xff09;&#xff1a; 栈的操作主要包括&#xff1a; 队列&#xff08;Queue&#xff09;&#xff1a; 队列的操作主要包括&#xff1a; 链表、数组 &#xff1a; 多个元素存储组成的 简述链表&#xff1a;数组&…

阶段十-分布式锁

5.1 节 为什么要使用分布式锁 锁是多线程代码中的概念&#xff0c;只有当多任务访问同一个互斥的共享资源时才需要。如下图&#xff1a; 在我们进行单机应用开发&#xff0c;涉及并发同步的时候&#xff0c;我们往往采用synchronized或者lock的方式来解决多线程间的代码同步问…

分布式任务调度平台XXL-JOB使用(二)

说明&#xff1a;之前总结过在CentOS系统里使用XXL-JOB。但在代码开发阶段&#xff0c;我们有时需要在本地环境测试定时任务代码&#xff0c;本文介绍如何在Windows系统使用XXL-JOB。 下载 &#xff08;1&#xff09;下载代码&#xff0c;解压打开 首先&#xff0c;去Github…

权责发生制和收付实现制

目录 一. 权责发生制(应记制)二. 收付实现制 \quad 一. 权责发生制(应记制) 应计制就是应该记入的意思 各项收入和费用的确认应当以“实际发生”&#xff08;归属期&#xff09;而不是以款项的实际收付作为记账的基础。 正是有会计期间假设&#xff0c;才有权责发生制和收付实…

逸学Docker【java工程师基础】3.1安装Jenkins

1.下载镜像 docker pull jenkins/jenkins:lts 2.运行容器 docker run -d -u root -p 8080:8080 -p 50000:50000 -v /var/jenkins_home:/var/jenkins_home -v /etc/localtime:/etc/localtime --name jenkins jenkins/jenkins:lts 3.要启动名为 jenkins 的 Docker 容器 docker st…

【软件测试】学习笔记-性能测试的基本方法与应用领域

这篇文章探讨并发用户数、响应时间和系统吞吐量这三个指标之间的关系和约束&#xff0c;性能测试七种常用方法&#xff0c;以及四大应用领域。 由于性能测试是一个很宽泛的话题&#xff0c;所以不同的人对性能测试的看法也不完全一样&#xff0c;同样一种方法可能也会有不同的…

基于STM32的CMT液晶屏控制器驱动程序设计与优化

本文以STM32微控制器为基础&#xff0c;设计并优化了一个用于控制CMT液晶屏的驱动程序。在设计过程中&#xff0c;我们首先介绍了液晶屏的基本工作原理&#xff0c;包括CMT液晶屏的结构和信号传输机制。然后&#xff0c;我们详细讨论了STM32微控制器的GPIO、SPI和DMA模块的特性…

Invalid bound statement (not found)(xml文件创建问题)

这边大致讲一下我的经历&#xff0c;不想看的直接点目录去解决方法 今天照着老师视频学习&#xff0c;中间老师在使用动态SQL时&#xff0c;直接复制了一份&#xff0c;我想这么简单的一个&#xff0c;我直接从网上找内容创建一个好了&#xff0c;但是&#xff0c;但是没想到过…

书生·浦语大模型实战营-学习笔记3

目录 (3)基于 InternLM 和 LangChain 搭建你的知识库1. 大模型开发范式&#xff08;RAG、Fine-tune&#xff09;RAG微调 &#xff08;传统自然语言处理的方法&#xff09; 2. LangChain简介&#xff08;RAG开发框架&#xff09;3. 构建向量数据库4. 搭建知识库助手5. Web Demo部…

word无法插入方程式(方程式反灰)

word无法插入方程式&#xff08;方程式反灰&#xff09; 来自实测>插入方程式&#xff0c;反灰用不了>随便存在哪里&#xff0c;右键看属性&#xff1a;>发现真的是doc&#xff0c;得改成docx才可以&#xff1a;>打开原始档案&#xff0c;另存为word文件即可&#…

机器学习 | 多层感知机MLP

机器学习 | 多层感知机MLP 1. 实验目的 自行构造一个多层感知机&#xff0c;完成对某种类型的样本数据的分类&#xff08;如图像、文本等&#xff09;&#xff0c;也可以对人工自行构造的二维平面超过3类数据点&#xff08;或者其它标准数据集&#xff09;进行分类。 2. 实验…

Java安装(可多版本共存)及IIntelliJ IDEA环境搭建汉化(保姆级教程!)

编程如画&#xff0c;我是panda&#xff01; 这次给大家出一期JAVA安装以及IIntelliJ IDEA的安装教程 IIntelliJ IDEA分为社区版和专业版&#xff0c;两版的教程都有&#xff0c;小伙伴们根据需要自行选择使用 并且我会讲解一台计算机中多个版本JAVA JDK配置安装 前言 我最早接…

书生·浦语大模型实战营笔记(四)

Finetune模型微调 直接使用现成的大语言模型&#xff0c;在某些场景下效果不好&#xff0c;需要根据具体场景进行微调 增量预训练&#xff1a;投喂垂类领域知识 陈述形式&#xff0c;无问答&#xff0c;即只有assistant 指令跟随&#xff1a;system-user-assistant XTuner …

【力扣每日一题】力扣2696删除子串后的字符串最小长度

题目来源 力扣2696删除子串后的字符串最小长度 题目概述 给你一个仅由 大写 英文字符组成的字符串 s 。 你可以对此字符串执行一些操作&#xff0c;在每一步操作中&#xff0c;你可以从 s 中删除 任一个 "AB" 或 "CD" 子字符串。 通过执行操作&#xff…