Java生成验证码详解

一、生成验证码图片

在Web应用程序中,为了防止机器人程序的攻击,我们经常使用验证码技术。验证码就是一张带有随机数、字母或图形的图片,用户需要输入正确的验证码才能通过验证。下面我们就来看一下如何用JAVA生成验证码图片。

1.1 写一个验证码工具类

首先,我们需要编写一个验证码工具类,这个类主要是生成验证码图片并输出到页面上。

public class VerifyCodeUtil {
    
    public static void outputImage(int width, int height, OutputStream os, String code) throws IOException {
        int verifySize = code.length();
        BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
        Random rand = new Random();
        Graphics2D g2 = image.createGraphics();
        g2.setColor(Color.WHITE);
        g2.fillRect(0,0,width,height);
        Font font = new Font("宋体",Font.BOLD,18);
        g2.setFont(font);
        for(int i=0;i<200;i++) {
            int x = rand.nextInt(width);
            int y = rand.nextInt(height);
            int red = rand.nextInt(255);
            int green = rand.nextInt(255);
            int blue = rand.nextInt(255);
            g2.setColor(new Color(red,green,blue));
            g2.drawLine(x,y,x+1,y+1);
        }
        g2.setColor(Color.BLACK);
        int size = width / verifySize;
        for(int i = 0;i<verifySize;i++) {
            String s = code.substring(i,i+1);
            int x = rand.nextInt(3);
            int y = rand.nextInt(5);
            g2.drawString(s,(i+1)*x ,y + 15);
        }
        g2.dispose();
        ImageIO.write(image,"JPEG",os);
    }
}

1.2 调用工具类生成验证码图片

有了工具类,我们就可以在项目中调用这个类生成验证码图片。以下是一个简单的示例代码:

public void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    response.setContentType("image/jpeg");
    String verifyCode = VerifyCodeUtil.generateVerifyCode(4);
    HttpSession session=request.getSession();
    session.setAttribute("verify_code", verifyCode);
    int w = 100, h = 30;
    VerifyCodeUtil.outputImage(w, h, response.getOutputStream(), verifyCode);
}

其中generateVerifyCode()函数是用来生成随机验证码字符串,我们可以根据需要设置验证码长度。以上代码将生成的验证码保存在session中,以便在提交表单时进行校验。

二、生成验证码BLOB数据

我们还可以生成验证码的BLOB数据,将其保存到数据库中。以下是与生成验证码BLOB数据相关的内容。

2.1 将生成的验证码图片转化为BLOB数据

public byte[] getVerifyCodeData(int width, int height, String verifyCode) {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    try {
        VerifyCodeUtil.outputImage(width, height, baos, verifyCode);
    } catch (IOException e) {
        e.printStackTrace();
    }
    return baos.toByteArray();
}

2.2 将验证码BLOB数据写入数据库

public void saveVerifyCode(String code) throws SQLException {
    byte[] verifyCodeData = getVerifyCodeData(80,30,code);
    Connection conn = null;
    PreparedStatement ps = null;
    String sql = "insert into verify_code (code_data) values(?)";
    try{
        conn = getConnection();
        ps = conn.prepareStatement(sql);
        ps.setBytes(1,verifyCodeData);
        ps.executeUpdate();
    }finally {
        closeConnection(conn, ps, null);
    }
}

三、验证码校验

在使用验证码的时候,我们需要对验证码进行校验。以下是验证码校验相关的内容。

3.1 比较验证码字符串

在提交表单时,我们需要获取用户输入的验证码,然后与生成的验证码字符串进行比较,判断是否正确。

public boolean verifyCode(HttpSession session, String input) {
    String code = (String)session.getAttribute("verify_code");
    if (StringUtils.isNotBlank(code) && StringUtils.isNotBlank(input) && input.toLowerCase().equals(code.toLowerCase())) {
        return true;
    }
    return false;
}

3.2 比较验证码BLOB数据

我们还可以将生成的验证码BLOB数据保存到数据库中,在进行校验时直接比较两个BLOB数据是否一致。

public boolean verifyCode(String input) throws SQLException{
    Connection conn = null;
    PreparedStatement ps = null;
    ResultSet rs = null;
    String sql = "select code_data from verify_code where id = (select max(id) from verify_code)";
    byte[] verifyCodeData = null;
    try{
        conn = getConnection();
        ps = conn.prepareStatement(sql);
        rs = ps.executeQuery();
        if(rs.next()){
            verifyCodeData = rs.getBytes(1);
        }
    }finally {
        closeConnection(conn, ps, rs);
    }
    byte[] inputCodeData = getVerifyCodeData(80,30,input);
    if(Arrays.equals(verifyCodeData, inputCodeData)){
        return true;
    }
    return false;
}

四、小结

本文详细介绍了JAVA生成验证码图片、生成验证码BLOB数据和验证验证码的操作。在开发Web应用程序时,验证码是一个不可或缺的部分。本文中给出的代码示例可以用来生成简单的验证码,读者可以根据需要进行修改和扩展。

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/254440.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-14 17:42
下一篇 2024-12-14 17:42

相关推荐

  • Java JsonPath 效率优化指南

    本篇文章将深入探讨Java JsonPath的效率问题,并提供一些优化方案。 一、JsonPath 简介 JsonPath是一个可用于从JSON数据中获取信息的库。它提供了一种DS…

    编程 2025-04-29
  • java client.getacsresponse 编译报错解决方法

    java client.getacsresponse 编译报错是Java编程过程中常见的错误,常见的原因是代码的语法错误、类库依赖问题和编译环境的配置问题。下面将从多个方面进行分析…

    编程 2025-04-29
  • Java腾讯云音视频对接

    本文旨在从多个方面详细阐述Java腾讯云音视频对接,提供完整的代码示例。 一、腾讯云音视频介绍 腾讯云音视频服务(Cloud Tencent Real-Time Communica…

    编程 2025-04-29
  • Java Bean加载过程

    Java Bean加载过程涉及到类加载器、反射机制和Java虚拟机的执行过程。在本文中,将从这三个方面详细阐述Java Bean加载的过程。 一、类加载器 类加载器是Java虚拟机…

    编程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介绍

    本文将详细介绍Java Milvus SearchParam withoutFields的相关知识和用法。 一、什么是Java Milvus SearchParam without…

    编程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java语言中的一个版本,于2014年3月18日发布。本文将从多个方面对Java 8中某一周的周一进行详细的阐述。 一、数组处理 Java 8新特性之一是Stream…

    编程 2025-04-29
  • Java判断字符串是否存在多个

    本文将从以下几个方面详细阐述如何使用Java判断一个字符串中是否存在多个指定字符: 一、字符串遍历 字符串是Java编程中非常重要的一种数据类型。要判断字符串中是否存在多个指定字符…

    编程 2025-04-29
  • VSCode为什么无法运行Java

    解答:VSCode无法运行Java是因为默认情况下,VSCode并没有集成Java运行环境,需要手动添加Java运行环境或安装相关插件才能实现Java代码的编写、调试和运行。 一、…

    编程 2025-04-29
  • Java任务下发回滚系统的设计与实现

    本文将介绍一个Java任务下发回滚系统的设计与实现。该系统可以用于执行复杂的任务,包括可回滚的任务,及时恢复任务失败前的状态。系统使用Java语言进行开发,可以支持多种类型的任务。…

    编程 2025-04-29
  • Java 8 Group By 会影响排序吗?

    是的,Java 8中的Group By会对排序产生影响。本文将从多个方面探讨Group By对排序的影响。 一、Group By的概述 Group By是SQL中的一种常见操作,它…

    编程 2025-04-29

发表回复

登录后才能评论