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日

相关文章

  • Kafka多节点分布式集群搭建实现过程详解

    接下来我将详细讲解 “Kafka多节点分布式集群搭建实现过程详解” 的完整攻略。 1. 什么是Kafka Kafka 是一种高吞吐量的分布式发布订阅消息系统,应用于大规模的消息处理环境中,具有高可用、高性能的特点。 2. Kafka 集群搭建 2.1 环境准备 在搭建Kafka集群之前,需要准备好以下环境: Oracle JDK 1.8或以上版本 Zooke…

    Java 2023年5月20日
    00
  • 如何调整Java元空间的大小?

    调整Java元空间的大小可以通过配置JVM的参数来实现。以下是完整的使用攻略: 1.了解JVM参数 要调整Java元空间的大小,需要了解如下两个JVM参数: -XX:MetaspaceSize: 设置元空间初始大小,默认为20.8 MB -XX:MaxMetaspaceSize: 设置元空间最大大小,默认为-1,表示无限制 2.使用示例 示例一:使用默认参数…

    Java 2023年5月11日
    00
  • WINDOWS系统 + Apache +PHP5 +Zend + MySQL + phpMyAdmin安装配置方法

    安装和配置WINDOWS系统 + Apache + PHP5 + Zend + MySQL + phpMyAdmin的步骤如下: 步骤一:安装Apache 1.下载Apache的Windows版本,建议使用官方的Apache Lounge版本,下载地址https://www.apachelounge.com/download/ 2.解压缩下载的安装包。 3.…

    Java 2023年6月16日
    00
  • 详解Java Spring AOP

    详解Java Spring AOP 什么是AOP? AOP代表面向切面编程。它是一种编程范例,它允许开发人员将行为分割成各个部分或单独的功能,在这些功能之间划清界限。AOP可以在程序的多个模块中实现可重用性,并使它更加容易测试和维护。 为什么要使用AOP? AOP 可以很好地解决几个横跨多个对象和层的问题: 记录日志、时间性能、监控对象的方法 对象在不同时间…

    Java 2023年5月19日
    00
  • Java环境下高德地图Api的使用方式

    Java环境下高德地图API的使用方式 介绍 高德地图API是高德公司提供的一组Web API,可用于在Web端,移动端或桌面端应用程序中调用地图相关服务和信息。本文将介绍在Java环境下如何使用高德地图API,包括如何进行账号注册、申请API key以及操作地图API的使用方式。 环境 Java环境:Java 8及以上版本 IDE:Eclipse或Inte…

    Java 2023年5月19日
    00
  • 汇编语言XOR指令:对两个操作数进行逻辑(按位)异或操作(推荐)

    汇编语言 XOR 指令 1. XOR 指令简介 XOR(exclusive or)指令是一种按位异或指令,用于对两个操作数进行逻辑(按位)异或操作。XOR 操作的结果是对两个操作数的每一位进行异或运算,若两个操作数的对应位不同,则结果对应位为 1,否则对应位为 0。 在汇编语言中,XOR 指令是一种常见的逻辑操作指令,可以用于处理数据加密、位运算、数据清零、…

    Java 2023年5月26日
    00
  • JS版微信6.0分享接口用法分析

    下面我将详细讲解“JS版微信6.0分享接口用法分析”的完整攻略。 一、JS版微信6.0分享接口简介 JS版微信6.0分享接口是微信公众号提供的一种方式,允许网站开发者在网页端调用微信分享功能,从而使用户直接将网页内容分享到微信朋友圈、好友或者分组内的好友。 二、JS版微信6.0分享接口使用步骤 1. 引入JS文件 在HTML文件中的head标签内,加入如下代…

    Java 2023年5月26日
    00
  • Spring Boot启动过程完全解析(一)

    下面是对《SpringBoot启动过程完全解析(一)》的详细讲解: 1. SpringBoot的启动过程 在SpringBoot启动过程中,主要涉及到以下几个步骤: 调用SpringApplication.run()方法启动应用程序 根据相应的配置加载ApplicationContext上下文 完成自动装配 启动嵌入式Web服务器 对于每一步的详细说明,请阅…

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