Java 随机生成验证码(支持大小写字母、数字、随机字体)的实例

先介绍一下Java生成验证码的基本流程:

  1. 随机生成字符或数字。
  2. 使用随机字体样式和大小。
  3. 创建画布,设置画布大小、背景色和边框。
  4. 在画布上绘制字符和干扰线等图形。
  5. 输出验证码图片。

下面我们来看一个完整的Java随机生成验证码的代码示例:

package com.example;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.util.Random;

import javax.imageio.ImageIO;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;

public class VerifyCodeUtils {

    // 验证码的字符集
    private static final String VERIFY_CODES = "23456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghjkmnpqrstuvwxyz";
    private static Random random = new Random();

    /**
     * 获取随机生成的验证码图片
     */
    public static void outputVerifyImage(HttpServletResponse response, int width, int height, int verifySize) {
        int x = width / (verifySize + 1);
        int y = height / 2;
        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        Graphics graphics = image.getGraphics();
        graphics.setColor(Color.WHITE);
        graphics.fillRect(0, 0, width, height);
        graphics.setColor(Color.BLACK);
        graphics.drawRect(0, 0, width - 1, height - 1);

        Font font = new Font("Arial", Font.PLAIN, verifySize);
        graphics.setFont(font);

        for (int i = 0; i < 50; i++) {
            int xs = random.nextInt(width);
            int ys = random.nextInt(height);
            int xe = xs + random.nextInt(width);
            int ye = ys + random.nextInt(height);
            graphics.setColor(getRandomColor());
            graphics.drawLine(xs, ys, xe, ye);
        }

        StringBuilder verifyCode = new StringBuilder();
        for (int i = 0; i < verifySize; i++) {
            String code = String.valueOf(VERIFY_CODES.charAt(random.nextInt(VERIFY_CODES.length())));
            verifyCode.append(code);
            graphics.setColor(getRandomColor());
            graphics.drawString(code, (i + 1) * x, y);
        }

        response.setContentType("image/jpeg");
        response.setHeader("Pragma", "no-cache");
        response.setHeader("Cache-Control", "no-cache");
        response.setDateHeader("Expires", 0);

        try (ServletOutputStream outputStream = response.getOutputStream()) {
            ImageIO.write(image, "JPEG", outputStream);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取随机颜色
     */
    private static Color getRandomColor() {
        int r = random.nextInt(255);
        int g = random.nextInt(255);
        int b = random.nextInt(255);
        return new Color(r, g, b);
    }
}

这段代码的作用是随机生成一个包含大小写字母和数字的验证码图片,支持自定义尺寸和样式。

我们来详细分析一下代码:

  1. 首先定义了一个常量VERIFY_CODES,表示验证码可选字符集合。
  2. 定义了一个生成随机数的Random对象random
  3. 定义了一个静态方法outputVerifyImage,该方法接收一个HttpServletResponse参数和三个整型参数,分别表示图像的宽度、高度和验证码字符串长度。
  4. 根据绘制区域大小创建一个BufferedImage对象image,并获取该对象的Graphics上下文graphics
  5. 使用graphics对象设置画布的背景色和绘制边框。
  6. 使用graphics对象绘制干扰线。
  7. 使用StringBuilder对象生成随机的验证码字符串并绘制到画布上。
  8. 最后向客户端输出验证码图片。
  9. 定义了一个私有方法getRandomColor,返回一个随机颜色。

接下来我们再给出一个使用该工具类生成验证码图片的示例:

package com.example;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class VerifyCodeServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {
        VerifyCodeUtils.outputVerifyImage(response, 120, 40, 4);
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {
        doGet(request, response);
    }
}

这个示例是一个Servlet类,使用doGet方法生成验证码图片,并将图片输出到HTTP响应中。

以上就是Java随机生成验证码的实例攻略,希望对您有帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java 随机生成验证码(支持大小写字母、数字、随机字体)的实例 - Python技术站

(0)
上一篇 2023年6月15日
下一篇 2023年6月15日

相关文章

  • 入门Java线程基础一篇就够了

    来讲解一下“入门Java线程基础一篇就够了”的攻略吧。 1. Java线程基础概念 1.1 什么是线程? 简单来说,线程是程序执行的一个单独的流程或执行单元。在Java中,每一个线程都是通过Thread类来创建和管理的。 1.2 如何创建一个线程? Java中创建线程的方式有两种: 继承Thread类,重写run()方法。 实现Runnable接口。 示例1…

    Java 2023年5月20日
    00
  • java中的Io(input与output)操作总结(三)

    标题:Java中的IO(Input与Output)操作总结(三) 概述 在Java中,IO是一项重要的操作。在前两篇文章中,我们讲解了Java中的Input与Output操作。本文将为大家介绍Java中的文件操作、Socket网络编程以及序列化操作。 文件操作 Java中,我们通过File类实现文件操作。首先,我们需要使用构造函数创建一个File对象,进而对…

    Java 2023年5月26日
    00
  • Java的Struts框架报错“InvalidChainException”的原因与解决办法

    当使用Java的Struts框架时,可能会遇到“InvalidChainException”错误。这个错误通常由以下原因之一起: 链无效:如果链无效,则可能会出现此错误。在这种情况下,需要检查链以解决此问题。 链配置错误:如果链配置错误,则可能会出现此错误。在这种情况下,需要检查链配置以解决此问题。 以下是两个实例: 例 1 如果链无效,则可以尝试检查链以解…

    Java 2023年5月5日
    00
  • 直接内存的作用是什么?

    直接内存是一种在Java中使用NIO(New Input/Output)时可以使用的内存区域。与Java堆内存不同,直接内存不受Java堆大小的限制,可以使用操作系统的内存,因此可以提高I/O操作的效率。在Java中,可以使用ByteBuffer类来操作直接内存。 以下是直接内存的完整使用攻略: 分配直接内存 在Java中,可以使用ByteBuffer类的a…

    Java 2023年5月12日
    00
  • ​​​​​​​Spring多租户数据源管理 AbstractRoutingDataSource

    下面是关于Spring多租户数据源管理的完整攻略。 什么是Spring多租户数据源管理? Spring多租户数据源管理是指在一个应用程序中,为不同的租户(tenant)提供不同的数据库连接,并通过一个中心路由器(AbstractRoutingDataSource)将相应的数据库连接与请求的租户关联起来,实现多租户级别的数据隔离。 AbstractRoutin…

    Java 2023年6月2日
    00
  • 四种引用类型在JAVA Springboot中的使用详解

    四种引用类型在JAVA Springboot中的使用详解 在Java Springboot中,有四种引用类型:强引用、软引用、弱引用和虚引用。这些引用类型的使用非常广泛,可以帮助我们更好地管理Java应用程序中的内存。下面我们将详细讲解这四种引用类型的使用。 强引用 强引用是我们使用最广泛的一种引用类型,它是默认的引用类型。当我们在代码中创建了一个对象并且将…

    Java 2023年5月19日
    00
  • Java编程实现深度优先遍历与连通分量代码示例

    Java编程实现深度优先遍历与连通分量代码示例 什么是深度优先遍历? 深度优先遍历是一种常见的图遍历算法,该算法从一个指定的源节点开始遍历图,尽可能深地搜索图中的所有节点。具体实现方式为:首先访问该节点,然后遍历该节点的所有连通节点,如果没有连通节点了,返回到上一级节点继续搜索。 深度优先遍历常被用来寻找图中的连通分量、拓扑排序等问题。 Java实现深度优先…

    Java 2023年5月19日
    00
  • C语言解决青蛙跳台阶问题(升级版)

    我们来讲解一下C语言如何解决青蛙跳台阶问题的升级版。 问题描述 青蛙跳台阶问题是经典的递归问题,其升级版要求在每次跳跃中可以跳1、2、3……n级台阶,问跳上n阶台阶有多少种跳法。 解题思路 在解决青蛙跳台阶问题的升级版时,我们可以将问题转化为数学模型,假设 f(i) 表示跳上第 i 阶台阶需要的跳跃方法数,则有如下公式: f(i)=f(i-1)+f(i-2)…

    Java 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部