java实现简单的验证码功能

yizhihongxing

以下是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日

相关文章

  • JSP 自定义标签实现数据字典的实例

    下面是“JSP 自定义标签实现数据字典的实例”的完整攻略。 什么是 JSP 自定义标签? JSP 自定义标签是 JSP 技术中的一种扩展机制,它可以让开发者自定义标签和标签库,以此来方便页面的开发和维护。通过自定义标签,我们可以把一些常规的代码片段独立出来,以标签的形式提供给页面的其他部分使用,这样可以极大地减少了开发重复代码的时间和精力。 数据字典是什么?…

    Java 2023年6月15日
    00
  • Jsp页面实现文件上传下载类代码第1/2页

    “Jsp页面实现文件上传下载类代码”是一个常见的需求,本篇攻略将为大家详细讲解如何实现这一操作。 第1页:文件上传 1. 在前端页面中添加上传文件的表单 首先,在前端页面中添加一个上传文件的表单,用户可以通过该表单上传文件。例如: <form action="upload.jsp" method="post" e…

    Java 2023年6月15日
    00
  • JSP技术实现动态页面到静态页面的方法

    JSP(JavaServer Pages)是一种基于Java的Web开发技术,可以将动态代码嵌入HTML页面中。而将JSP页面转换为静态页面主要是为了提高页面的访问速度和减少服务器的压力。以下是实现JSP页面转换为静态页面的完整攻略: 步骤一:创建JSP页面 首先,需要创建一个JSP页面,该页面执行动态页面的功能。创建JSP页面的过程类似于创建一个HTML页…

    Java 2023年6月15日
    00
  • Java基于解释器模式实现定义一种简单的语言功能示例

    Java基于解释器模式可以实现定义一种简单的语言功能,这里给出一个完整的攻略以及两条示例说明: 什么是解释器模式? 解释器模式是一种行为型设计模式,它用于定义语言的文法,并使用该文法来解释和执行语言中的语句。使用解释器模式时,我们需要定义语言的文法,然后编写解释器来解释和执行语言中的语句。 解释器模式的结构 解释器模式由以下几个部分组成: 抽象表达式(Abs…

    Java 2023年5月19日
    00
  • 创造世界上最简单的 PHP 开发模式第1/5页

    下面我将详细讲解如何创造世界上最简单的 PHP 开发模式。 步骤1:准备工作 在开始之前,需要确保已经安装了PHP环境和开发工具,例如使用xampp,wampserver或者直接安装PHP和Apache。如果你还没有安装,请先进行安装。 步骤2:创建项目文件夹 首先,我们需要创建一个新的项目文件夹,并将其命名为“myproject”。可以按照以下步骤进行操作…

    Java 2023年6月15日
    00
  • 一不小心就让Java开发踩坑的fail-fast是个什么鬼?(推荐)

    一不小心就让Java开发踩坑的fail-fast是个什么鬼? 在Java中,有一种叫做fail-fast的机制,它主要是用于快速发现程序中的错误,并迅速抛出异常。 什么是fail-fast机制? fail-fast机制指的是集合中在进行结构性操作(增删改)时,如果集合的状态发生了变化,那么就立即抛出异常以终止当前操作,这样可以防止对集合的并发修改。 在Jav…

    Java 2023年5月25日
    00
  • 浅谈Spring Data如何简化数据操作的方法

    浅谈Spring Data如何简化数据操作的方法 对于数据操作,Spring Data 提供了一种简单高效的解决方案。该方案旨在尽量减少代码量,同时提供易于使用的API以简化开发。下面我们将从以下三个方面介绍 Spring Data: Spring Data 的架构 Spring Data 的特点 Spring Data 的常用操作 Spring Data …

    Java 2023年5月20日
    00
  • spring boot多数据源动态切换代码实例

    下面将为您详细讲解如何实现在Spring Boot应用中实现多数据源动态切换,并提供两个示例。 一、前置条件 在开始编写代码之前,需要满足以下条件: 确保已经正确配置了多个数据源,这些数据源需要连接的数据库表结构和数据内容都应当是相同的; 当前应用中必须已经引入了相关依赖,这里采用Spring Boot 2.x版本为例: <dependencies&g…

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