Java后端实现生成验证码图片的示例代码

 更新时间:2023年12月21日 13:56:06   作者:小筱在线  
验证码是一种用于验证用户身份或确保用户操作安全的技术手段,通常以图形、声音或文字的形式出现,本文主要介绍了如何通过java实现生成验证码图片,需要的可以参考下

验证码是一种用于验证用户身份或确保用户操作安全的技术手段。它通常以图形、声音或文字的形式出现,要求用户在登录、注册或进行特定操作之前输入正确的验证码。

验证码的目的是防止网络恶意行为,如恶意注册、暴力破解密码、爬取数据等。通过要求用户正确输入验证码,可以有效阻止机器人或自动化程序的访问。

常见的验证码形式包括图像验证码、音频验证码和文字验证码。图像验证码要求用户识别并选择特定图像中的特定物体或图案,音频验证码要求用户听取一段随机生成的音频并输入其中的数字或字母,文字验证码则要求用户识别并输入特定的字母、数字或符号。

验证码的生成和验证通常基于特定的算法和技术,如随机数生成、图像识别、语音合成等。验证码通常具有一定的复杂性和难度,以确保只有真正的用户能够解读和输入正确的验证码。

然而,验证码也可能给用户带来一定的不便,特别是对于视力或听力有障碍的用户。因此,一些网站和应用程序也提供了可选的辅助功能,如文字提示、放大镜、语音提示等,以帮助用户更好地完成验证码验证。

下面讲解一下如何使用Java生成验证码图片。

代码如下:

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;
    /**
     * 验证码字符个数
     */
    private int codeCount = 5;
    /**
     * 验证码干扰线数
     */
    private int lineCount = 150;
    /**
     * 验证码
     */
    private String code = null;
    /**
     * 验证码图片Buffer
     */
    private BufferedImage buffImg = null;
 
    // 验证码范围,去掉0(数字)和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();
        }
    }
}

效果如下

到此这篇关于Java后端实现生成验证码图片的示例代码的文章就介绍到这了,更多相关Java生成验证码图片内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

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

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

    这篇文章主要为大家详细介绍了java常用工具类,包括IP、File文件工具类,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-05-05
  • Java数据结构二叉树难点解析

    Java数据结构二叉树难点解析

    树是一种重要的非线性数据结构,直观地看,它是数据元素(在树中称为结点)按分支关系组织起来的结构,很象自然界中的树那样。树结构在客观世界中广泛存在,如人类社会的族谱和各种社会组织机构都可用树形象表示
    2021-10-10
  • java mybatis框架实现多表关系查询功能

    java mybatis框架实现多表关系查询功能

    这篇文章主要介绍了java mybatis框架实现多表关系查询,基于Maven框架的整体设计 —— 一多一的关系,文中通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-10-10
  • Java设计模式之访问者模式

    Java设计模式之访问者模式

    这篇文章介绍了Java设计模式之访问者模式,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-10-10
  • Spring Boot前后端分离开发模式中的跨域问题及解决方法

    Spring Boot前后端分离开发模式中的跨域问题及解决方法

    本文介绍了解决Spring Boot前端Vue跨域问题的实战经验,并提供了后端和前端的配置示例,通过配置后端和前端,我们可以轻松解决跨域问题,实现正常的前后端交互,需要的朋友可以参考下
    2023-09-09
  • 深入理解Java中没那么简单的单例模式

    深入理解Java中没那么简单的单例模式

    这篇文章主要给大家详细介绍了Java单例模式,关于Java中的单例模式并非看起来那么简单的,为什么要这么说呢?下面通过这篇文章来一起看看吧,有需要的朋友们可以参考借鉴。
    2017-01-01
  • Java基础知识杂文

    Java基础知识杂文

    这篇文章主要介绍了Java基础知识杂文,具有一定借鉴价值,需要的朋友可以参考下。
    2017-12-12
  • Java基于栈方式解决汉诺塔问题实例【递归与非递归算法】

    Java基于栈方式解决汉诺塔问题实例【递归与非递归算法】

    这篇文章主要介绍了Java基于栈方式解决汉诺塔问题的方法,结合实例形式分析了java栈方式采用递归与非递归算法解决汉诺塔问题的相关操作技巧,需要的朋友可以参考下
    2017-11-11
  • springboot配置多数据源并集成Druid和mybatis的操作

    springboot配置多数据源并集成Druid和mybatis的操作

    这篇文章主要介绍了springboot配置多数据源并集成Druid和mybatis的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • SpringBoot使用Swagger生成多模块的API文档

    SpringBoot使用Swagger生成多模块的API文档

    这篇文章将以 Spring Boot 多模块项目为例,为大家详细介绍一下如何使用 Swagger 生成多模块的 API 文档,感兴趣的小伙伴可以了解一下
    2025-02-02

最新评论