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日

相关文章

  • 获取上一页面的URL和本页的URL的方法

    获取上一页面的URL和本页的URL是前端开发中比较基础的操作,可以通过以下几种方式来实现: 获取上一页面的URL 1. 使用document.referrer属性 document.referrer属性可以返回上一页面的URL,但是需要在当前页面进行跳转才能获取。 console.log(document.referrer); // 输出上一页面的URL 2…

    Java 2023年6月15日
    00
  • Java反射概念与使用实例代码

    Java反射是Java语言自带的一种强大的机制,允许在运行时动态地获取类的信息、访问或修改类的属性和方法等。本文将详细讲解Java反射的概念和使用,包含以下内容: 反射概述 反射实现方式 反射的作用与优缺点 反射使用的实例代码 反射概述 Java反射(Reflection)是Java语言中的一种机制。它可以让我们在运行时动态地获取类的信息、访问或修改类的属性…

    Java 2023年5月30日
    00
  • springboot注入servlet的方法

    下面是详细讲解Spring Boot注入Servlet的方法的完整攻略。 1. 添加Servlet API依赖 在Spring Boot中使用Servlet必须要先添加Servlet API依赖。可以在pom.xml文件中添加以下依赖项: <dependency> <groupId>javax.servlet</groupId&…

    Java 2023年5月19日
    00
  • Java+Selenium实现控制浏览器的启动选项Options

    一、关于Java+SeleniumJava+Selenium是用于Web应用程序自动化测试的最流行的工具组合。 Selenium支持大多数浏览器,并且具有简单易用的API。 二、控制浏览器的启动选项Options当使用Java+Selenium进行Web自动化测试时,我们可以通过控制浏览器的启动选项Options来更改浏览器的一些默认设置,例如窗口大小、启动…

    Java 2023年5月20日
    00
  • 三道java新手入门面试题,通往自由的道路–锁+Volatile

    三道Java新手入门面试题攻略 一、什么是锁? 锁是一种同步机制,用于控制多个线程对共享资源的访问。当多个线程试图访问同一共享资源时,可能会导致数据不一致或者其他问题,而锁就可以保证同一时刻只有一个线程访问该共享资源,避免多线程并发访问发生问题。 Java提供了两种锁机制:synchronized关键字和Lock接口。 synchronized关键字 syn…

    Java 2023年5月19日
    00
  • Spring AOP官方文档学习笔记(四)之Spring AOP的其他知识点

    1.选择哪种AOP (1) 使用Spring AOP比使用完整版的AspectJ更方便简单,因为不需要在开发和构建过程中引入AspectJ编译器以及织入器,如果我们只希望通知能够在Spring Bean上执行,那么选用Spring AOP就可以了,如果我们希望通知能够在不由Spring所管理的对象上执行,那么就需要使用AspectJ,如果我们希望为除方法以外…

    Java 2023年5月10日
    00
  • 用jquery获取select标签中选中的option值及文本的示例

    获取select标签中选中的option值及文本是jQuery中的常用操作。下面是完整的攻略: 获取选中的option值 使用val()方法获取选中的option的值,示例代码如下: // HTML结构 <select id="fruit"> <option value="apple">苹果&l…

    Java 2023年6月15日
    00
  • Java运行时动态生成对象的方法小结

    下面是详细的Java运行时动态生成对象的方法攻略。 1. 简介 在Java中,动态生成对象可以使用Class类的newInstance方法实现。新的创建对象方式是在运行时实现的,因此被称为Java运行时动态生成对象。使用这种方式可以避免在编译时给出类名的麻烦,只需要在运行时确定需要实例化的类名即可。 2. 方法使用 Class类是Java中所有类的超类,它通…

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