java实现简单的验证码功能

以下是Java实现简单验证码功能的攻略:

步骤一:生成验证码

  1. 导入相关类库。需要导入Java中的BufferedImageGraphicsColorRandom
import java.awt.Color;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.util.Random;
  1. 定义画布大小和验证码长度。可以根据需要调整大小和长度,这里使用的是宽度200像素、高度50像素,长度为4个字符。
int width = 200;
int height = 50;
int length = 4;
  1. 创建BufferedImage对象。然后根据画布大小生成相同大小的图片。
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
  1. 获取绘图句柄。通过Graphics类设置验证码的一些参数,例如颜色、字体等。
Graphics g = image.getGraphics();
g.setColor(Color.WHITE); // 设置背景颜色
g.fillRect(0, 0, width, height);
g.setFont(new Font("Arial", Font.PLAIN, 30)); // 设置字体
  1. 生成随机验证码。这里使用了Random类生成4个10以内的随机数。
Random random = new Random();
String verifyCode = "";
for (int i = 0; i < length; i++) {
    int value = random.nextInt(10); // 生成0~9的随机整数
    verifyCode += value; // 将随机数添加到验证码末尾
}
  1. 绘制验证码。将验证码绘制在图片中。
g.drawString(verifyCode, 50, 40); // 在(50, 40)的位置绘制验证码
  1. 添加干扰线和点。可以增加验证码的安全性。这里使用直线和圆形的方式添加干扰线和点。
// 添加干扰线
for (int i = 0; i < 6; i++) {
    int x1 = random.nextInt(width);
    int y1 = random.nextInt(height);
    int x2 = random.nextInt(width);
    int y2 = random.nextInt(height);
    g.setColor(new Color(random.nextInt(255), random.nextInt(255), random.nextInt(255)));
    g.drawLine(x1, y1, x2, y2);
}
// 添加点
for (int i = 0; i < 50; i++) {
    int x = random.nextInt(width);
    int y = random.nextInt(height);
    g.setColor(new Color(random.nextInt(255), random.nextInt(255), random.nextInt(255)));
    g.fillOval(x, y, 2, 2);
}
  1. 结束绘制。释放资源。
g.dispose(); // 释放绘图资源
  1. 返回验证码。返回生成的验证码和图片。
Map<String, Object> resultMap = new HashMap<>();
resultMap.put("verifyCode", verifyCode);
resultMap.put("image", image);
return resultMap;

步骤二:使用验证码

  1. 调用生成验证码的方法。获取到返回的验证码和图片。
Map<String, Object> resultMap = createVerifyCode(); // 调用生成验证码的方法
String verifyCode = resultMap.get("verifyCode").toString(); // 获取验证码
BufferedImage image = (BufferedImage) resultMap.get("image"); // 获取图片
  1. 在前端页面中显示验证码。将图片以Base64的形式嵌入HTML中。
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAZAAAAGQCAIAAAB6T/buAAAACXBIWXMAAA7DAAAOwwHHb6hkAAAAKklEQVR42mP8/5+hGgAmVDWyLRCCVT6dpf8uAAAChJREFUeNpiYGBgEABACQQhtif8Xj5wAAAAASUVORK5CYII=" />
  1. 检查用户输入的验证码是否正确。获取用户提交的验证码,与生成的验证码进行比对。
if (userVerifyCode.equals(verifyCode)) {
    // 验证码正确
} else {
    // 验证码错误
}

示例说明

示例一:基础版验证码

下面是一个简单的示例,实现了一个基础的验证码生成功能。验证码的宽度为100像素,高度为30像素,长度为4个字符。每次请求生成的验证码均不同。

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

public class VerifyCodeUtils {

    public static Map<String, Object> createVerifyCode() {
        int width = 100;
        int height = 30;
        int length = 4;

        // 创建BufferedImage对象
        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        Graphics g = image.getGraphics();

        // 设置背景颜色和字体
        g.setColor(Color.white);
        g.fillRect(0, 0, width, height);
        g.setFont(new Font("Arial", Font.BOLD, 20));

        // 生成验证码
        String verifyCode = "";
        Random random = new Random();
        for (int i = 0; i < length; i++) {
            int value = random.nextInt(10);
            verifyCode += value;
        }

        // 绘制验证码
        g.setColor(Color.black);
        g.drawString(verifyCode, 20, 22);

        // 添加干扰线和点
        for (int i = 0; i < 6; i++) {
            int x1 = random.nextInt(width);
            int y1 = random.nextInt(height);
            int x2 = random.nextInt(width);
            int y2 = random.nextInt(height);
            g.setColor(new Color(random.nextInt(255), random.nextInt(255), random.nextInt(255)));
            g.drawLine(x1, y1, x2, y2);
        }
        for (int i = 0; i < 50; i++) {
            int x = random.nextInt(width);
            int y = random.nextInt(height);
            g.setColor(new Color(random.nextInt(255), random.nextInt(255), random.nextInt(255)));
            g.fillOval(x, y, 2, 2);
        }

        // 释放资源
        g.dispose();

        // 返回结果
        Map<String, Object> resultMap = new HashMap<>();
        resultMap.put("verifyCode", verifyCode);
        resultMap.put("image", image);
        return resultMap;
    }

}

示例二:可配置化验证码

下面是另一个示例,实现了一个可配置化的验证码生成功能。可以根据需要配置验证码的大小、颜色、长度、字符集等参数,返回生成的验证码和图片。

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;

public class VerifyCodeUtils {

    public static Map<String, Object> createVerifyCode(Map<String, Object> config) {
        int width = Integer.valueOf(config.getOrDefault("width", "200").toString());
        int height = Integer.valueOf(config.getOrDefault("height", "50").toString());
        int length = Integer.valueOf(config.getOrDefault("length", "4").toString());
        String charset = config.getOrDefault("charset", "0123456789").toString();
        int lineWidth = Integer.valueOf(config.getOrDefault("line_width", "1").toString());
        List<Color> colorList = new ArrayList<>();
        colorList.add(new Color(91, 155, 213));
        colorList.add(new Color(237, 125, 49));
        colorList.add(new Color(165, 165, 165));
        colorList.add(new Color(255, 192, 0));

        // 创建BufferedImage对象
        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        Graphics g = image.getGraphics();

        // 设置背景颜色和字体
        g.setColor(Color.white);
        g.fillRect(0, 0, width, height);
        g.setFont(new Font("Arial", Font.BOLD, 30));

        // 生成验证码
        String verifyCode = "";
        Random random = new Random();
        for (int i = 0; i < length; i++) {
            int value = random.nextInt(charset.length());
            verifyCode += charset.charAt(value);
        }

        // 绘制验证码
        for (int i = 0; i < length; i++) {
            g.setColor(colorList.get(random.nextInt(colorList.size())));
            char c = verifyCode.charAt(i);
            int x = (int) (width * 0.1) + (int) (width * 0.8) / length * i;
            int y = (int) (height * 0.7);
            g.drawString(String.valueOf(c), x, y);
        }

        // 添加干扰线和点
        for (int i = 0; i < 6; i++) {
            int x1 = random.nextInt(width);
            int y1 = random.nextInt(height);
            int x2 = random.nextInt(width);
            int y2 = random.nextInt(height);
            g.setColor(new Color(random.nextInt(255), random.nextInt(255), random.nextInt(255)));
            g.drawLine(x1, y1, x2, y2);
        }
        for (int i = 0; i < 50; i++) {
            int x = random.nextInt(width);
            int y = random.nextInt(height);
            g.setColor(new Color(random.nextInt(255), random.nextInt(255), random.nextInt(255)));
            g.fillOval(x, y, 2, 2);
        }

        // 释放资源
        g.dispose();

        // 返回结果
        Map<String, Object> resultMap = new HashMap<>();
        resultMap.put("verifyCode", verifyCode);
        resultMap.put("image", image);
        return resultMap;
    }

}

这里的参数可以通过调用该方法时传入一个Map类型的参数进行配置,例如:

Map<String, Object> config = new HashMap<>();
config.put("width", 200);
config.put("height", 40);
config.put("length", 5);
config.put("charset", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789");
config.put("line_width", 2);
Map<String, Object> resultMap = VerifyCodeUtils.createVerifyCode(config);
String verifyCode = resultMap.get("verifyCode").toString();
BufferedImage image = (BufferedImage) resultMap.get("image");

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java实现简单的验证码功能 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • MyBatisPlus分页的同时指定排序规则说明

    在使用MyBatisPlus进行分页时,可以同时指定排序规则,以保证分页结果的正确性。下面详细讲解如何进行操作。 1.在Mapper接口中定义分页查询方法 首先在Mapper接口中定义分页查询方法,方法需要使用MyBatisPlus提供的IPage来进行分页操作,示例如下: public interface MyMapper extends BaseMapp…

    Java 2023年5月20日
    00
  • 启动Spring项目详细过程(小结)

    启动Spring项目详细过程 启动一个Spring项目可以分为以下几个步骤: 1. 创建项目 在IDE中创建一个新的Spring项目,可以选择使用Spring Initializr或手动创建。 使用Spring Initializr Spring Initializr是一个Web UI,可以用来方便地创建Spring项目。 打开Spring Initiali…

    Java 2023年5月19日
    00
  • Spring Boot LocalDateTime格式化处理的示例详解

    下面我将为您详细讲解“Spring Boot LocalDateTime格式化处理的示例详解”。 1. 简介 在Spring Boot中,要对LocalDateTime类型进行格式化处理,可以使用DateTimeFormatter类的ofPattern()方法或@DateTimeFormat注解进行处理。下面将分别介绍两种方法及其示例。 2. 使用DateT…

    Java 2023年5月20日
    00
  • Java实现简单通讯录管理系统

    Java实现简单通讯录管理系统的完整攻略包含以下步骤: 1. 需求分析 首先要了解用户的需求,确定要开发哪些功能并对其进行分析及设计。通讯录管理系统需要实现的功能如下: 添加联系人 查询联系人 修改联系人 删除联系人 显示所有联系人 2. 数据存储 数据存储是通讯录管理系统的核心,因此需要确定使用哪种方式来存储联系人信息。可以选择文件存储、数据库存储或者内存…

    Java 2023年5月23日
    00
  • 讲解Java中的基础类库和语言包的使用

    十分感谢你提出的问题。下面我将详细讲解“讲解Java中的基础类库和语言包的使用”的完整攻略。 什么是Java基础类库和语言包? Java基础类库和语言包是Java语言核心库的一部分,提供了大量的基本类和接口,Java程序都可以直接使用。其中Java基础类库包含很多常用的类和接口,如字符串(String)、集合(Collection)、IO操作(IO)等;而J…

    Java 2023年5月26日
    00
  • Maven打包没有指定主类问题(xxx.jar中没有主清单属性)

    Maven是Java项目管理工具之一。当使用Maven打包项目时,有时会遇到没有指定主类问题,即在xxx.jar中没有主清单属性的错误。这时候,我们就需要手动指定主类。 以下是指定Maven项目主类的完整攻略,步骤如下: 步骤 1:在pom.xml中指定打包方式 首先,我们需要在pom.xml中指定打包方式为可执行的Jar包。这可以通过在pom.xml文件中…

    Java 2023年5月19日
    00
  • kafka分布式消息系统基本架构及功能详解

    Kafka分布式消息系统基本架构及功能详解 Kafka简介 Kafka是一个高性能、可扩展、分布式的消息处理平台。它最初是由Linkedin公司开发的,现在已经成为Apache顶级项目之一。Kafka主要用于消息的发布和订阅过程中的分布式处理,可以处理每秒数百万条消息,非常适合使用在大数据处理、实时流处理、日志收集、用户活动跟踪等场景。 Kafka基本架构 …

    Java 2023年5月20日
    00
  • SpringBoot使用Spring-Data-Jpa实现CRUD操作

    下面我来为你讲解如何在SpringBoot中使用Spring-Data-Jpa实现CRUD操作。 一、什么是Spring-Data-Jpa Spring-Data-JPA是Spring Data家族中的一个模块,它基于JPA规范,提供了对JPA的支持。它简化了数据访问层的开发,提升了数据访问的效率。通过Spring-Data-Jpa可以轻松实现对关系型数据库…

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