JavaSE自定义验证码图片生成器

news/2025/2/13 0:47:42/

设计项目的时候打算在原有的功能上补充验证码功能,在实现了邮箱验证码之后想着顺便把一个简单的图片验证码生成器也实现一下,用作分享。

注意,实际开发中验证码往往采用各种组件,通过导入依赖来在后端开发时使用相关功能,而不会自己手动地实现一个原生的验证码生成器。

采取组件的方式我也尝试过,在这里不作分享,感兴趣的同学可以参考这位大佬介绍的Hutool:登录验证码实现-CSDN博客

这里分享一下手动实现的生成验证码的后端功能,逻辑很简单,方便大家理解。可以在 SpringBoot项目Controller中实现调用代码,加到实际的业务逻辑中。

Github:GitHub - wyd333/CaptchaTest: 自定义验证码生成器

(生成的验证码图片长这样: 

CaptchaGenerator

import java.awt.*;
import java.awt.image.BufferedImage;import java.util.Random;public class CaptchaGenerator extends CodeUtil{private static final int WIDTH = 200;private static final int HEIGHT = 50;private static final int FONT_SIZE = 30; //字符大小private String loginCode; //验证码/*** 生成验证码图片* @return*/public BufferedImage getLoginCodeImage(){//验证码图片BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);Graphics graphics = image.getGraphics();// 1-生成随机验证码loginCode = createCode();// 2-设置背景drawBackground(graphics);// 3-绘制验证码drawRands(graphics, loginCode.toCharArray());// 4-关闭资源graphics.dispose();return image;}private static void drawRands(Graphics g, char[] rands) {g.setFont(new Font("Console", Font.BOLD, FONT_SIZE));for (int i = 0; i < rands.length; i++) {g.setColor(getRandomColor());g.drawString("" + rands[i], i * FONT_SIZE + 10, 30);}}/*** 生成 CODE_LENGTH 长度的随机验证码* @return*/@Overridepublic String createCode() {// 可以包含在验证码中的字符集合String charset = "0123456789" + "abcdefghijklmnopqrstuvwxyz" + "ABCDEFGHIJKLMNOPQRSTUVWXYZ";Random random = new Random();StringBuilder code = new StringBuilder();for (int i = 0; i < CODE_LENGTH; i++) {int randomIndex = random.nextInt(charset.length());code.append(charset.charAt(randomIndex));}return code.toString();}/*** 获取随机颜色给验证码文本* @return 随机颜色*/private static Color getRandomColor() {Random ran = new Random();return new Color(ran.nextInt(220), ran.nextInt(220), ran.nextInt(220));}/*** 绘制验证码图片背景* @param g 图片对象*/private static void drawBackground(Graphics g) {g.setColor(Color.white);g.fillRect(0, 0, WIDTH, HEIGHT);// 绘制验证码干扰点for (int i = 0; i < 200; i++) {int x = (int) (Math.random() * WIDTH);int y = (int) (Math.random() * HEIGHT);g.setColor(getRandomColor());g.drawOval(x, y, 1, 1);}}public String getLoginCode() {return loginCode;}}

测试类:生成5张验证码图片并保存

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;/*** Created with IntelliJ IDEA.* Description: 测试:生成5张验证码图片并保存*/
public class Main {public static void main(String[] args) {int i = 5;while(i > 0) {CaptchaGenerator captchaGenerator = new CaptchaGenerator();BufferedImage image = captchaGenerator.getLoginCodeImage();// 保存图片到文件try {File output = new File("captcha" + i + ".png");ImageIO.write(image, "png", output);} catch (IOException e) {e.printStackTrace();}i--;}}}


http://www.ppmy.cn/news/1254627.html

相关文章

【Go语言反射reflect】

Go语言反射reflect 一、引入 先看官方Doc中Rob Pike给出的关于反射的定义&#xff1a; Reflection in computing is the ability of a program to examine its own structure, particularly through types; it’s a form of metaprogramming. It’s also a great source of …

Docker 简介及其常用命令详解

Docker 简介及其常用命令详解 Docker 自推出以来&#xff0c;已成为开发和运维领域的重要工具。它简化了应用的部署、测试和分发过程&#xff0c;使得容器化技术成为现代软件开发的标准实践。本文将为您提供Docker的基础介绍以及其常用命令的详细讲解。 什么是Docker&#xf…

skywalking告警qq邮箱发送

首先开启发送接收qq邮箱的权限 开启之后&#xff0c;会让你发送信息&#xff0c;按着一系列操作&#xff0c;获得password &#xff08;授权码&#xff08;例如&#xff0c;qq开启SMTP授权码&#xff0c;qq授权码16位&#xff09;&#xff09; <!-- mail邮箱-->…

基于相关性的四种机器学习聚类方法

在这篇文章中&#xff0c;基于20家公司的股票价格时间序列数据。根据股票价格之间的相关性&#xff0c;看一下对这些公司进行分类的四种不同方式。 苹果&#xff08;AAPL&#xff09;&#xff0c;亚马逊&#xff08;AMZN&#xff09;&#xff0c;Facebook&#xff08;META&…

数据结构(超详细讲解!!)第二十五节 树与森林

1.树的存储结构 和线性表一样&#xff0c;树可以用顺序和链式两种存储结构。 树的顺序存储结构适合树中结点比较“满”的情况。根据树的非线性结构特点&#xff0c;常用链式存储方式来表示树。树常用的存储方法有&#xff1a;双亲表示法、孩子表示法和孩子兄弟表…

目标检测YOLO系列从入门到精通技术详解100篇-【目标检测】缺陷检测

目录 几个高频面试题目 深度学习工具在缺陷检测中是如何工作的? 深度学习是如何工作的? 深度学习缺陷检测技术

canvas基础:绘制虚线

canvas实例应用100 专栏提供canvas的基础知识&#xff0c;高级动画&#xff0c;相关应用扩展等信息。 canvas作为html的一部分&#xff0c;是图像图标地图可视化的一个重要的基础&#xff0c;学好了canvas&#xff0c;在其他的一些应用上将会起到非常重要的帮助。 文章目录 示例…

通过两个css属性提升长列表渲染效率

content-visibilitycontain-intrinsic-size content-visibility是CSS新增的属性&#xff0c;主要用来提高页面渲染性能&#xff0c;它可以控制一个元素是否渲染其内容&#xff0c;并且允许浏览器跳过这些元素的布局与渲染。 visible&#xff1a;默认值&#xff0c;没有效果。元…