用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.pswp.cn/bicheng/71486.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/71486.shtml
英文地址,請注明出處:http://en.pswp.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 執行過程差異**結合現象分析…