当前位置: 首页 > news >正文

用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应用登录/注册的验证码校验。
  • 防止机器人批量操作的接口防护。

相关文章:

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

在Java中创建一个验证码工具类&#xff0c;可以通过以下代码实现。该工具类支持生成包含字母和数字的随机验证码图片&#xff0c;并添加干扰线和噪点以提高安全性。以下是详细实现&#xff1a; 完整代码实现 import javax.imageio.ImageIO; import java.awt.*; import java.aw…...

uvm中的激励是如何发送出去的

在UVM中&#xff0c;Sequence生成的激励&#xff08;Transaction&#xff09;通过以下协作流程发送到Driver并最终驱动到DUT&#xff0c;其核心机制如下&#xff1a; --------------- --------------- ------------ ----- | Sequence | → | Seque…...

一只企鹅如何改变世界

一、历史的转折点:一只企鹅如何改变世界 1991年,芬兰大学生Linus Torvalds在邮件列表中写道:“我正在做一个自由的操作系统(只是爱好,不会像GNU那样庞大专业)”。这个后来被称为Linux内核的项目,与GNU项目的结合,点燃了开源运动的燎原之火。 关键演化: 1996年:Tux企…...

拦截器VS过滤器:Spring Boot中请求处理的艺术!

目录 一、拦截器&#xff08;Interceptor&#xff09;和过滤器&#xff08;Filter&#xff09;&#xff1a;都是“守门员”&#xff01;二、如何实现拦截器和过滤器&#xff1f;三、拦截器和过滤器的区别四、执行顺序五、真实的应用场景六、总结 &#x1f31f;如果喜欢作者的讲…...

C语言预处理学习笔记

1. 预处理器的功能 预处理器&#xff08;Preprocessor&#xff09;在编译C语言程序之前对源代码进行预处理。预处理指令以#号开头&#xff0c;主要包括文件包含、宏定义、条件编译等功能。 2. 文件包含 文件包含功能用于在一个文件中包含另一个文件的内容&#xff0c;通常用…...

LLM基础环境准备-云服务器

软件环境 腾讯云 操作系统&#xff1a; TencentOS Server 3.1 (TK4) Python: 3.9.0(使用 conda的虚拟python环境&#xff0c;可根据实际需要更换版本&#xff0c;当前使用的是3.9.0的版本) CUDA Version: 12.2&#xff08;腾讯云会自动安装&#xff09; Driver Version: 5…...

网络协议相关知识有哪些?

前言 网络协议的基础是OSI和TCP/IP模型,这两个模型是理解协议分层的关键。 正文(仅是个人理解,如有遗漏望海涵) 网络协议是网络中设备间通信的规则和标准,涉及数据传输、路由、错误控制等多个方面。以下是网络协议相关知识的系统梳理: 一、网络协议分层模型 1、OSI七…...

基于Llama 3.2-Vision的医学报告生成

记录运用大模型解决医学报告实例&#xff0c;仅介绍本地调用的情况。 前情提要 已安装 Python 显存不少于8G&#xff08;8G设备上测试成功&#xff0c;其他环境可以自行测试&#xff09;。 需要安装Ollama (Ollama 是一个允许在本地运行多模态模型的平台)。 方式1&#xff1…...

离线部署大模型:ollama+deepseek+open-webui

ollama 是一个开源的本地大语言模型运行框架&#xff0c;它提供了非常简单便捷的使用形式&#xff0c;让用户可以十分方便的在本地机器上部署和运行大型语言模型&#xff0c;从而实现免费离线的方式使用 LLM 能力&#xff0c;并确保私有数据的隐私和安全性。 1 ollama 安装 o…...

如何看nginx.conf文件?

是的&#xff0c;你的理解是对的&#xff01;在 Nginx 配置中&#xff0c;最内层的 location 确实是决定请求最终处理的“入口”。当请求进入 Nginx 时&#xff0c;Nginx 会根据请求的路径&#xff08;即 URL&#xff09;匹配 location 块&#xff0c;然后按照匹配的顺序逐层向…...

3月营销日历:开启春日盛宴,绽放生活魅力

关键营销节点∶惊蛰、女生节、妇女节、 植树节、315消费者权益日、春分 营销关键词 养生、女生魅力、感恩女性、环保、品质 01.重点关注品类 春季服饰&#xff1a;如轻薄外套、春装等&#xff0c;适合惊蛰后的市场需求&#xff1b; 美妆护肤&#xff1a;妇女节期间&#xf…...

pdf预览在vue项目中的使用兼容ie浏览器

一、下载pdf预览插件 链接: https://pan.baidu.com/s/1wuzay-saAfiqtS-efd-cvw?pwd6m78 提取码: 6m78 二、创建一个pdf文件夹&#xff0c;将下载下来的文件build和web文件夹复制到pdf文件夹下 三、项目中使用 (路径由两部分组成&#xff0c;第一部分是项目存放pdf插件的路径…...

Unity面板介绍_Project工程面板(23.1.1)

一、project(工程界面) 显示当前工程所有资源文件&#xff08;场景、脚本、音频、图片。。&#xff09; Assets资源文件、Library库文件、Project setting项目设置、Temp临时文件 二、面板大致...

使用Termux将安卓手机变成随身AI服务器(page assist连接)

通过以下方法在安卓手机上运行 Ollama 及大模型&#xff0c;无需 Root 权限&#xff0c;具体方案如下&#xff1a; 通过 Termux 模拟 Linux 环境运行 核心工具&#xff1a; 安装 &#xff08;安卓终端模拟器&#xff09;()]。借助 proot-distro 工具安装 Linux 发行版&#xf…...

MacOS安装Emacs

个人博客地址&#xff1a;MacOS安装Emacs | 一张假钞的真实世界 在MacOS X上可以使用Homebrew 安装Emacs&#xff1a; $ brew install emacs --with-cocoa 或者用MacPorts&#xff1a; $ sudo port install emacs-app OSX Emacs 网站提供了通用的二进制包。 前两种方法安装…...

OpenCV机器学习(10)训练数据的一个核心类cv::ml::TrainData

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::ml::TrainData 类是 OpenCV 机器学习模块中用于表示训练数据的一个核心类。它封装了样本数据、响应&#xff08;标签&#xff09;、样本权重…...

3.1 actor基本框架(c#的Akka.Actor模式)

1.最简单的一个框架 代码如下&#xff08;代码容易理解&#xff09;&#xff1a; using System; using Akka.Actor; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Security.Cryptography.X509Certi…...

Git使用[同一电脑多个账户ssh-key的管理]

同一电脑多个账户ssh-key的管理 现在遇到一个问题,我同一台电脑既要通过VPN访问内网的git也要访问对外释放的gitee,刚开始我直接把原来的SSH-key添加到内网的gitlab发现可以访问,但是后来再方位外网的gitee就出问题了,看来要换一种手段才行 本文引用&#xff1a;https://cloud…...

使用Python结合`stable-baselines3`库(包含PPO和TD3算法)以及`gym`库来实现分层强化学习的示例代码

以下是一个使用Python结合stable-baselines3库&#xff08;包含PPO和TD3算法&#xff09;以及gym库来实现分层强化学习的示例代码。该代码将环境中的动作元组分别提供给高层处理器PPO和低层处理器TD3进行训练&#xff0c;并实现单独训练和共同训练的功能。 代码实现 import g…...

【论文笔记】MambaGlue: Fast and Robust Local Feature Matching With Mamba

【引用格式】&#xff1a;Ryoo K, Lim H, Myung H. MambaGlue: Fast and Robust Local Feature Matching With Mamba[J]. arXiv preprint arXiv:2502.00462, 2025. 【网址】&#xff1a;https://arxiv.org/pdf/2502.00462 【开源代码】&#xff1a;https://github.com/uri-Ka…...

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…...

React Native 导航系统实战(React Navigation)

导航系统实战&#xff08;React Navigation&#xff09; React Navigation 是 React Native 应用中最常用的导航库之一&#xff0c;它提供了多种导航模式&#xff0c;如堆栈导航&#xff08;Stack Navigator&#xff09;、标签导航&#xff08;Tab Navigator&#xff09;和抽屉…...

MMaDA: Multimodal Large Diffusion Language Models

CODE &#xff1a; https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA&#xff0c;它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构&#xf…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1

每日一言 生活的美好&#xff0c;总是藏在那些你咬牙坚持的日子里。 硬件&#xff1a;OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写&#xff0c;"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”

2025年#高考 将在近日拉开帷幕&#xff0c;#AI 监考一度冲上热搜。当AI深度融入高考&#xff0c;#时间同步 不再是辅助功能&#xff0c;而是决定AI监考系统成败的“生命线”。 AI亮相2025高考&#xff0c;40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕&#xff0c;江西、…...

以光量子为例,详解量子获取方式

光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学&#xff08;silicon photonics&#xff09;的光波导&#xff08;optical waveguide&#xff09;芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中&#xff0c;光既是波又是粒子。光子本…...

AI病理诊断七剑下天山,医疗未来触手可及

一、病理诊断困局&#xff1a;刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断"&#xff0c;医生需通过显微镜观察组织切片&#xff0c;在细胞迷宫中捕捉癌变信号。某省病理质控报告显示&#xff0c;基层医院误诊率达12%-15%&#xff0c;专家会诊…...

LLMs 系列实操科普(1)

写在前面&#xff1a; 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容&#xff0c;原视频时长 ~130 分钟&#xff0c;以实操演示主流的一些 LLMs 的使用&#xff0c;由于涉及到实操&#xff0c;实际上并不适合以文字整理&#xff0c;但还是决定尽量整理一份笔…...

Unity UGUI Button事件流程

场景结构 测试代码 public class TestBtn : MonoBehaviour {void Start(){var btn GetComponent<Button>();btn.onClick.AddListener(OnClick);}private void OnClick(){Debug.Log("666");}}当添加事件时 // 实例化一个ButtonClickedEvent的事件 [Formerl…...

【LeetCode】算法详解#6 ---除自身以外数组的乘积

1.题目介绍 给定一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O…...