用Java创建一个验证码的工具类

在Java中创建一个验证码工具类,可以通过以下代码实现。该工具类支持生成包含字母和数字的随机验证码图片,并添加干扰线和噪点以提高安全性。以下是详细实现:


完整代码实现

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Random;
import java.util.Base64;/*** 验证码生成工具类*/
public class CaptchaUtils {// 默认参数配置private static final int DEFAULT_WIDTH = 120;      // 默认图片宽度private static final int DEFAULT_HEIGHT = 40;      // 默认图片高度private static final int DEFAULT_CODE_LENGTH = 4;  // 默认验证码长度private static final int DEFAULT_LINE_COUNT = 5;   // 默认干扰线数量private static final int DEFAULT_NOISE_COUNT = 30; // 默认噪点数量// 可选字符集(排除易混淆字符)private static final String CHAR_SET = "ABCDEFGHJKLMNPQRSTUVWXYZabcdefghjkmnpqrstuvwxyz23456789";/*** 生成验证码图片和对应字符串* @return CaptchaResult 包含验证码图片的Base64字符串和验证码值*/public static CaptchaResult generateCaptcha() {return generateCaptcha(DEFAULT_CODE_LENGTH, DEFAULT_WIDTH, DEFAULT_HEIGHT, DEFAULT_LINE_COUNT, DEFAULT_NOISE_COUNT);}/*** 自定义参数的验证码生成方法*/public static CaptchaResult generateCaptcha(int codeLength, int width, int height, int lineCount, int noiseCount) {// 1. 生成随机验证码字符串String code = generateRandomCode(codeLength);// 2. 创建图片对象BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);Graphics2D g = image.createGraphics();// 3. 绘制背景色g.setColor(Color.WHITE);g.fillRect(0, 0, width, height);// 4. 绘制干扰线drawInterferenceLines(g, width, height, lineCount);// 5. 绘制验证码字符drawCode(g, code, width, height);// 6. 添加噪点addNoise(image, width, height, noiseCount);// 7. 释放资源g.dispose();// 8. 转换为Base64字符串String base64Image = convertImageToBase64(image);return new CaptchaResult(code, base64Image);}// 生成随机验证码字符串private static String generateRandomCode(int length) {Random random = new Random();StringBuilder sb = new StringBuilder();for (int i = 0; i < length; i++) {int index = random.nextInt(CHAR_SET.length());sb.append(CHAR_SET.charAt(index));}return sb.toString();}// 绘制干扰线private static void drawInterferenceLines(Graphics2D g, int width, int height, int lineCount) {Random random = new Random();for (int i = 0; i < lineCount; i++) {int x1 = random.nextInt(width);int y1 = random.nextInt(height);int x2 = random.nextInt(width);int y2 = random.nextInt(height);g.setColor(getRandomColor());g.drawLine(x1, y1, x2, y2);}}// 绘制验证码字符private static void drawCode(Graphics2D g, String code, int width, int height) {Random random = new Random();g.setFont(new Font("Arial", Font.BOLD, 30));for (int i = 0; i < code.length(); i++) {// 字符颜色随机g.setColor(getRandomColor());// 字符位置偏移int x = (width / code.length()) * i + 10;int y = height - 10;// 添加随机旋转double theta = Math.toRadians(random.nextInt(30) - 15); // -15°~15°g.rotate(theta, x, y);g.drawString(String.valueOf(code.charAt(i)), x, y);g.rotate(-theta, x, y); // 恢复角度}}// 添加噪点private static void addNoise(BufferedImage image, int width, int height, int noiseCount) {Random random = new Random();for (int i = 0; i < noiseCount; i++) {int x = random.nextInt(width);int y = random.nextInt(height);image.setRGB(x, y, getRandomColor().getRGB());}}// 生成随机颜色(避免浅色)private static Color getRandomColor() {Random random = new Random();return new Color(random.nextInt(180), random.nextInt(180), random.nextInt(180));}// 将图片转为Base64字符串private static String convertImageToBase64(BufferedImage image) {try (ByteArrayOutputStream bos = new ByteArrayOutputStream()) {ImageIO.write(image, "JPEG", bos);byte[] bytes = bos.toByteArray();return "data:image/jpeg;base64," + Base64.getEncoder().encodeToString(bytes);} catch (IOException e) {throw new RuntimeException("生成验证码失败", e);}}/*** 验证码结果封装类*/public static class CaptchaResult {private final String code;      // 验证码值private final String base64Image; // Base64格式图片public CaptchaResult(String code, String base64Image) {this.code = code;this.base64Image = base64Image;}public String getCode() {return code;}public String getBase64Image() {return base64Image;}}// 测试public static void main(String[] args) {CaptchaResult result = CaptchaUtils.generateCaptcha();System.out.println("验证码值: " + result.getCode());System.out.println("Base64图片:\n" + result.getBase64Image());}
}

核心功能说明

  1. 生成随机字符串

    • 使用预定义的字符集(排除易混淆字符如0/O1/I等)。
    • 通过Random生成指定位数的验证码。
  2. 创建验证码图片

    • 使用BufferedImage创建画布。
    • 设置背景色为白色,并绘制干扰线和噪点。
  3. 干扰元素设计

    • 干扰线:随机位置和颜色。
    • 噪点:随机位置的点状干扰。
    • 字符旋转:每个字符随机旋转-15°~15°。
  4. Base64编码输出

    • 将生成的图片转为Base64字符串,便于Web前端直接显示。

使用示例

// 生成默认验证码(4位,120x40像素)
CaptchaUtils.CaptchaResult result = CaptchaUtils.generateCaptcha();// 自定义参数生成验证码(6位,200x60像素,10条干扰线,50个噪点)
CaptchaUtils.CaptchaResult customResult = CaptchaUtils.generateCaptcha(6, 200, 60, 10, 50);// 获取验证码值和图片
String code = result.getCode();
String base64Image = result.getBase64Image();

优化点

  1. 安全性增强

    • 使用SecureRandom代替Random(需导入java.security.SecureRandom)。
    • 添加字符扭曲或缩放效果(需扩展drawCode方法)。
  2. 扩展性

    • 支持自定义字符集、字体类型、颜色范围等参数。
    • 通过Builder模式提供更灵活的配置。
  3. 性能优化

    • 缓存常用参数配置的验证码样式。
    • 使用线程安全的随机数生成器。

适用场景

  • Web应用登录/注册的验证码校验。
  • 防止机器人批量操作的接口防护。

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

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

相关文章

提升信息检索准确性和效率的搜索技巧

一、基础技巧 精准关键词 避免长句子&#xff0c;提取核心关键词&#xff08;如用“光合作用 步骤”代替“请告诉我光合作用的具体过程”&#xff09;。 同义词替换&#xff1a;尝试不同表达&#xff08;如“AI 发展史” vs “人工智能 历史”&#xff09;。 排除干扰词 使用…

设计模式 之 工厂模式(简单工厂模式、工厂方法模式、抽象工厂模式)(C++)

文章目录 C 工厂模式引言一、简单工厂模式概念实现步骤示例代码优缺点 二、工厂方法模式概念实现步骤示例代码优缺点 三、抽象工厂模式概念实现步骤示例代码优缺点 C 工厂模式 引言 在 C 编程中&#xff0c;对象的创建是一个常见且基础的操作。然而&#xff0c;当项目规模逐渐…

DAY12 Tensorflow 六步法搭建神经网络

六步法&#xff1a; 一.import 导入各种库&#xff0c;比如&#xff1a; import tensorflow as tf from tensorflow.keras.layers import Dense, Flatten from tensorflow.keras import Model import numpy as np import pandas as pd # 可能还会根据需求导入其他库&…

Zookeeper分布式锁实现

zookeeper最初设计的初衷就是为了保证分布式系统的一致性。本文将讲解如何利用zookeeper的临时顺序结点&#xff0c;实现分布式锁。 目录 1. 理论分析 1.1 结点类型 1.2 监听器 1.3 实现原理 2. 手写实现简易zookeeper分布式锁 1.1 依赖 1.2 常量定义 1.3 实现zookeeper分布式…

Git是什么

简单介绍&#xff1a; Git是一个分布式版本控制系统&#xff0c;用于跟踪文件的更改&#xff0c;特别是在多人协作开发的环境中。 Key: 分布式 版本控制 系统 最常用于软件开发&#xff0c;但也可以用于管理任何类型的文件和文件夹。 Git帮助团队跟踪和管理文件的历史版本&a…

Pycharm 2024在解释器提供的python控制台中运行py文件

2024版的界面发生了变化, run with python console搬到了这里:

【分布式理论12】事务协调者高可用:分布式选举算法

文章目录 一、分布式系统中事务协调的问题二、分布式选举算法1. Bully算法2. Raft算法3. ZAB算法 三、小结与比较 一、分布式系统中事务协调的问题 在分布式系统中&#xff0c;常常有多个节点&#xff08;应用&#xff09;共同处理不同的事务和资源。前文 【分布式理论9】分布式…

免费deepseek的API获取教程及将API接入word或WPS中

免费deepseek的API获取教程: 1 https://cloud.siliconflow.cn/中注册时填写邀请码&#xff1a;GAejkK6X即可获取2000 万 Tokens; 2 按照图中步骤进行操作 将API接入word或WPS中 1 打开一个word&#xff0c;文件-选项-自定义功能区-勾选开发工具-左侧的信任中心-信任中心设置…

【SFRA】笔记

GK_SFRA_INJECT(x) SFRA小信号注入函数,向控制环路注入一个小信号。如下图所示,当前程序,小信号注入是在固定占空比的基础叠加小信号,得到新的占空比,使用该占空比控制环路。 1.2 GK_SFRA_COLLECT(x, y) SFRA数据收集函数,将小信号注入环路后,该函数收集环路的数据,以…

论文笔记-WSDM2024-LLMRec

论文笔记-WSDM2024-LLMRec: Large Language Models with Graph Augmentation for Recommendation LLMRec: 基于图增强的大模型推荐摘要1.引言2.前言2.1使用图嵌入推荐2.2使用辅助信息推荐2.3使用数据增强推荐 3.方法3.1LLM作为隐式反馈增强器3.2基于LLM的辅助信息增强3.2.1用户…

Ubuntu 系统 cuda12.2 安装 MMDetection3D

DataBall 助力快速掌握数据集的信息和使用方式&#xff0c;会员享有 百种数据集&#xff0c;持续增加中。 需要更多数据资源和技术解决方案&#xff0c;知识星球&#xff1a; “DataBall - X 数据球(free)” 贵在坚持&#xff01; ---------------------------------------…

Tomcat的升级

Tomcat 是一个开源的 Java Servlet 容器&#xff0c;用于部署 Java Servlet 和 JavaServer Pages&#xff08;JSP&#xff09;。随着新版本的发布&#xff0c;Tomcat 通常会带来性能改进、安全增强、新特性和对最新 Java 版本的更好支持。升级 Tomcat 服务器通常涉及到以下几个…

Python常见面试题的详解10

1. 哪些操作会导致 Python 内存溢出&#xff0c;怎么处理&#xff1f; 要点 1. 创建超大列表或字典&#xff1a;当我们一次性创建规模极为庞大的列表或字典时&#xff0c;会瞬间占用大量的内存资源。例如&#xff0c;以下代码试图创建一个包含 10 亿个元素的列表&#xff0c;在…

多个用户如何共用一根网线传输数据

前置知识 一、电信号 网线&#xff08;如以太网线&#xff09;中传输的信号主要是 电信号&#xff0c;它携带着数字信息。这些信号用于在计算机和其他网络设备之间传输数据。下面是一些关于网线传输信号的详细信息&#xff1a; 1. 电信号传输 在以太网中&#xff0c;数据是…

华为昇腾 910B 部署 DeepSeek-R1 蒸馏系列模型详细指南

本文记录 在 华为昇腾 910B(65GB) * 8 上 部署 DeepSeekR1 蒸馏系列模型&#xff08;14B、32B&#xff09;全过程与测试结果。 NPU&#xff1a;910B3 (65GB) * 8 &#xff08;910B 有三个版本 910B1、2、3&#xff09; 模型&#xff1a;DeepSeek-R1-Distill-Qwen-14B、DeepSeek…

【前端】Vue组件库之Element: 一个现代化的 UI 组件库

文章目录 前言一、官网1、官网主页2、设计原则3、导航4、组件 二、核心功能&#xff1a;开箱即用的组件生态1、丰富的组件体系2、特色功能亮点 三、快速上手&#xff1a;三步开启组件化开发1、安装&#xff08;使用Vue 3&#xff09;2、全局引入3、按需导入&#xff08;推荐&am…

关于uniApp的面试题及其答案解析

我的血液里流淌着战意&#xff01;力量与智慧指引着我&#xff01; 文章目录 1. 什么是uniApp&#xff1f;2. uniApp与原生小程序开发有什么区别&#xff1f;3. 如何使用uniApp实现条件编译&#xff1f;4. uniApp支持哪些平台&#xff0c;各有什么特点&#xff1f;5. 在uniApp中…

Ubuntu 下 nginx-1.24.0 源码分析 - ngx_pool_t 类型

ngx_pool_t 定义在 src/core/ngx_core.h typedef struct ngx_pool_s ngx_pool_t; ngx_pool_s 定义在 src/core/ngx_palloc.h struct ngx_pool_s {ngx_pool_data_t d;size_t max;ngx_pool_t *current;ngx_chain_t *chain;ng…

力扣 最长递增子序列

动态规划&#xff0c;二分查找。 题目 由题&#xff0c;从数组中找一个最长子序列&#xff0c;不难想到&#xff0c;当这个子序列递增子序列的数越接近时是越容易拉长的。从dp上看&#xff0c;当遍历到这个数&#xff0c;会从前面的dp选一个最大的数加上当前数&#xff0c;注意…

Linux | 进程控制(进程终止与进程等待)

文章目录 Linux | 进程控制 — 进程终止 & 进程等待1、进程终止进程常见退出方法1.1退出码基本概念获取退出码的方式常见退出码约定使用场景 1.2 strerror函数 & errno宏1.3 _exit函数1.4_exit和exit的区别1.4.1 所属头文件与函数原型1.4.2 执行过程差异**结合现象分析…