首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 實現彩色驗證碼生成完整代碼解析

     編輯:Java 相關知識

需求場景

登入頁面生成彩色驗證碼圖片,使用者需輸入帳號、密碼、驗證碼三重驗證。

核心實現:makeCertPic JavaBean

package pic;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.OutputStream;
import java.util.Random;
import javax.imageio.ImageIO;

public class makeCertPic {
    private char[] mapTable = {
        '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'
    };

    public String getCertPic(int width, int height, OutputStream os) {
        if (width <= 0) width = 60;
        if (height <= 0) height = 20;

        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        Graphics g = image.getGraphics();

        // 背景
        g.setColor(new Color(0xDCDCDC));
        g.fillRect(0, 0, width, height);
        // 邊框
        g.setColor(Color.BLACK);
        g.drawRect(0, 0, width-1, height-1);

        // 隨機 4 位驗證碼
        StringBuilder strEnsure = new StringBuilder();
        for (int i = 0; i < 4; i++) {
            strEnsure.append(mapTable[(int)(mapTable.length * Math.random())]);
        }

        // 繪製字符 (錯位增加識別難度)
        g.setFont(new Font("Atlantic Inline", Font.PLAIN, 18));
        g.setColor(Color.BLACK);
        String code = strEnsure.toString();
        g.drawString(code.substring(0,1), 8, 17);
        g.drawString(code.substring(1,2), 20, 15);
        g.drawString(code.substring(2,3), 35, 18);
        g.drawString(code.substring(3,4), 45, 15);

        // 干擾點
        Random rand = new Random();
        for (int i = 0; i < 10; i++) {
            g.drawOval(rand.nextInt(width), rand.nextInt(height), 1, 1);
        }

        g.dispose();
        try {
            ImageIO.write(image, "JPEG", os);
        } catch (IOException e) {
            return "";
        }
        return code;
    }
}

關鍵技術點

  • 記憶體圖像:BufferedImage 離屏渲染,無需臨時檔案。
  • Graphics 上下文:繪製背景、邊框、文字、干擾點。
  • 隨機字符集:可自訂 mapTable 排除易混淆字元 (如 o/0, l/1)。
  • 輸出流直寫:ImageIO.write(image, "JPEG", os) 直接輸響應流,適合 Servlet/JSP 輸出 image/jpeg。
  • Session 儲存:回傳的驗證碼字串需存入 Session,登入時比對。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved