亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java后端實(shí)現(xiàn)生成驗(yàn)證碼圖片的示例代碼

 更新時(shí)間:2023年12月21日 13:56:06   作者:小筱在線  
驗(yàn)證碼是一種用于驗(yàn)證用戶身份或確保用戶操作安全的技術(shù)手段,通常以圖形、聲音或文字的形式出現(xiàn),本文主要介紹了如何通過java實(shí)現(xiàn)生成驗(yàn)證碼圖片,需要的可以參考下

驗(yàn)證碼是一種用于驗(yàn)證用戶身份或確保用戶操作安全的技術(shù)手段。它通常以圖形、聲音或文字的形式出現(xiàn),要求用戶在登錄、注冊或進(jìn)行特定操作之前輸入正確的驗(yàn)證碼。

驗(yàn)證碼的目的是防止網(wǎng)絡(luò)惡意行為,如惡意注冊、暴力破解密碼、爬取數(shù)據(jù)等。通過要求用戶正確輸入驗(yàn)證碼,可以有效阻止機(jī)器人或自動化程序的訪問。

常見的驗(yàn)證碼形式包括圖像驗(yàn)證碼、音頻驗(yàn)證碼和文字驗(yàn)證碼。圖像驗(yàn)證碼要求用戶識別并選擇特定圖像中的特定物體或圖案,音頻驗(yàn)證碼要求用戶聽取一段隨機(jī)生成的音頻并輸入其中的數(shù)字或字母,文字驗(yàn)證碼則要求用戶識別并輸入特定的字母、數(shù)字或符號。

驗(yàn)證碼的生成和驗(yàn)證通?;谔囟ǖ乃惴ê图夹g(shù),如隨機(jī)數(shù)生成、圖像識別、語音合成等。驗(yàn)證碼通常具有一定的復(fù)雜性和難度,以確保只有真正的用戶能夠解讀和輸入正確的驗(yàn)證碼。

然而,驗(yàn)證碼也可能給用戶帶來一定的不便,特別是對于視力或聽力有障礙的用戶。因此,一些網(wǎng)站和應(yīng)用程序也提供了可選的輔助功能,如文字提示、放大鏡、語音提示等,以幫助用戶更好地完成驗(yàn)證碼驗(yàn)證。

下面講解一下如何使用Java生成驗(yàn)證碼圖片。

代碼如下:

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Random;
 
/**
 * @author tobiasy
 * @date 2020/4/10
 */
public class ValidateCode {
 
    private int width = 160;
    private int height = 40;
    /**
     * 驗(yàn)證碼字符個(gè)數(shù)
     */
    private int codeCount = 5;
    /**
     * 驗(yàn)證碼干擾線數(shù)
     */
    private int lineCount = 150;
    /**
     * 驗(yàn)證碼
     */
    private String code = null;
    /**
     * 驗(yàn)證碼圖片Buffer
     */
    private BufferedImage buffImg = null;
 
    // 驗(yàn)證碼范圍,去掉0(數(shù)字)和O(拼音)容易混淆的(小寫的1和L也可以去掉,大寫不用了)
//    private char[] codeSequence = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'P', 'Q', 'R',
//            'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '2', '3', '4', '5', '6', '7', '8', '9'};
    private char[] codeSequence = {'1', '2', '3', '4', '5', '6', '7', '8', '9'};
 
    public ValidateCode() {
        this.createCode();
    }
 
    public ValidateCode(int width, int height) {
        this.width = width;
        this.height = height;
        this.createCode();
    }
 
    public ValidateCode(int width, int height, int codeCount, int lineCount) {
        this.width = width;
        this.height = height;
        this.codeCount = codeCount;
        this.lineCount = lineCount;
        this.createCode();
    }
 
 
    public void createCode() {
        int x, fontHeight, codey;
        x = width / (codeCount + 2);
        fontHeight = height - 2;
        codey = height - 4;
        buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        Graphics2D g = buffImg.createGraphics();
        buffImg = g.getDeviceConfiguration().createCompatibleImage(width, height, Transparency.TRANSLUCENT);
        g.dispose();
        g = buffImg.createGraphics();
        g.fillRect(128, 128, width, height);
        Random random = new Random();
        Font font = new Font("微軟雅黑", Font.PLAIN, fontHeight);
        g.setFont(font);
        for (int i = 0; i < lineCount; i++) {
            int xs = random.nextInt(width);
            int ys = random.nextInt(height);
            int xe = xs + random.nextInt(width / 8);
            int ye = ys + random.nextInt(height / 8);
            g.setColor(getRandomColor());
            g.drawLine(xs, ys, xe, ye);
        }
        StringBuilder randomCode = new StringBuilder();
        for (int i = 0; i < codeCount; i++) {
            String strRand = String.valueOf(codeSequence[random.nextInt(codeSequence.length)]);
            g.setColor(getRandomColor());
            g.drawString(strRand, (i + 1) * x, codey);
            randomCode.append(strRand);
        }
        code = randomCode.toString();
    }
 
    private Color getRandomColor(){
        Random random = new Random();
        return new Color(random.nextInt(255), random.nextInt(255), random.nextInt(255));
    }
 
 
    public void write(String path) throws IOException {
        OutputStream sos = new FileOutputStream(path);
        this.write(sos);
    }
 
 
    public void write(OutputStream sos) throws IOException {
        ImageIO.write(buffImg, "png", sos);
        sos.close();
    }
 
 
    public BufferedImage getBuffImg() {
        return buffImg;
    }
 
 
    public String getCode() {
        return code;
    }
 
    public static void main(String[] args) {
        ValidateCode vCode = new ValidateCode(160, 40, 4, 60);
        try {
            String path = "F:/test/images/" + System.currentTimeMillis() + ".png";
            FileOutputStream fileOutputStream = new FileOutputStream(new File(path));
            vCode.write(fileOutputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

效果如下

到此這篇關(guān)于Java后端實(shí)現(xiàn)生成驗(yàn)證碼圖片的示例代碼的文章就介紹到這了,更多相關(guān)Java生成驗(yàn)證碼圖片內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java常用工具類 IP、File文件工具類

    java常用工具類 IP、File文件工具類

    這篇文章主要為大家詳細(xì)介紹了java常用工具類,包括IP、File文件工具類,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • Java數(shù)據(jù)結(jié)構(gòu)二叉樹難點(diǎn)解析

    Java數(shù)據(jù)結(jié)構(gòu)二叉樹難點(diǎn)解析

    樹是一種重要的非線性數(shù)據(jù)結(jié)構(gòu),直觀地看,它是數(shù)據(jù)元素(在樹中稱為結(jié)點(diǎn))按分支關(guān)系組織起來的結(jié)構(gòu),很象自然界中的樹那樣。樹結(jié)構(gòu)在客觀世界中廣泛存在,如人類社會的族譜和各種社會組織機(jī)構(gòu)都可用樹形象表示
    2021-10-10
  • java mybatis框架實(shí)現(xiàn)多表關(guān)系查詢功能

    java mybatis框架實(shí)現(xiàn)多表關(guān)系查詢功能

    這篇文章主要介紹了java mybatis框架實(shí)現(xiàn)多表關(guān)系查詢,基于Maven框架的整體設(shè)計(jì) —— 一多一的關(guān)系,文中通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-10-10
  • Java設(shè)計(jì)模式之訪問者模式

    Java設(shè)計(jì)模式之訪問者模式

    這篇文章介紹了Java設(shè)計(jì)模式之訪問者模式,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-10-10
  • Spring Boot前后端分離開發(fā)模式中的跨域問題及解決方法

    Spring Boot前后端分離開發(fā)模式中的跨域問題及解決方法

    本文介紹了解決Spring Boot前端Vue跨域問題的實(shí)戰(zhàn)經(jīng)驗(yàn),并提供了后端和前端的配置示例,通過配置后端和前端,我們可以輕松解決跨域問題,實(shí)現(xiàn)正常的前后端交互,需要的朋友可以參考下
    2023-09-09
  • 深入理解Java中沒那么簡單的單例模式

    深入理解Java中沒那么簡單的單例模式

    這篇文章主要給大家詳細(xì)介紹了Java單例模式,關(guān)于Java中的單例模式并非看起來那么簡單的,為什么要這么說呢?下面通過這篇文章來一起看看吧,有需要的朋友們可以參考借鑒。
    2017-01-01
  • Java基礎(chǔ)知識雜文

    Java基礎(chǔ)知識雜文

    這篇文章主要介紹了Java基礎(chǔ)知識雜文,具有一定借鑒價(jià)值,需要的朋友可以參考下。
    2017-12-12
  • Java基于棧方式解決漢諾塔問題實(shí)例【遞歸與非遞歸算法】

    Java基于棧方式解決漢諾塔問題實(shí)例【遞歸與非遞歸算法】

    這篇文章主要介紹了Java基于棧方式解決漢諾塔問題的方法,結(jié)合實(shí)例形式分析了java棧方式采用遞歸與非遞歸算法解決漢諾塔問題的相關(guān)操作技巧,需要的朋友可以參考下
    2017-11-11
  • springboot配置多數(shù)據(jù)源并集成Druid和mybatis的操作

    springboot配置多數(shù)據(jù)源并集成Druid和mybatis的操作

    這篇文章主要介紹了springboot配置多數(shù)據(jù)源并集成Druid和mybatis的操作,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • SpringBoot使用Swagger生成多模塊的API文檔

    SpringBoot使用Swagger生成多模塊的API文檔

    這篇文章將以?Spring?Boot?多模塊項(xiàng)目為例,為大家詳細(xì)介紹一下如何使用?Swagger?生成多模塊的?API?文檔,感興趣的小伙伴可以了解一下
    2025-02-02

最新評論