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日

相关文章

  • Spring Boot面试必问之启动流程知识点详解

    下面我将为你详细讲解Spring Boot中启动流程的相关知识点。 1. Spring Boot应用启动原理 Spring Boot的应用启动依赖于Spring框架,其启动过程是基于Spring框架的启动过程进行的。在Spring Boot应用启动过程中,主要包含以下步骤: 加载Spring Boot应用的配置信息; 创建Spring应用上下文Applica…

    Java 2023年5月19日
    00
  • .htaccess文件使用教程总结

    下面是“.htaccess文件使用教程总结”的详细攻略: 什么是.htaccess文件 .htaccess文件是一种在Apache Web服务器上配置Web服务器的文件,可以让您定义许多方面的服务器行为和规则。 创建.htaccess文件 在创建.htaccess文件之前,您需要确保您的服务器上启用了.htaccess文件。在Apache服务器中,默认情况下…

    Java 2023年6月15日
    00
  • JAVAEE中用Session简单实现购物车功能示例代码

    我会为你提供一份详细的JAVAEE中使用Session简单实现购物车功能的攻略。 首先,我们需要了解一下Session的概念:Session是在服务器端保存用户信息的机制,通过Session可以在同一客户端多次请求之间保持用户的信息,而且Session只存在于服务器端,不会像Cookie那样被客户端读取或篡改。 那么接下来,我们就可以开始实现一个简单的购物车…

    Java 2023年5月23日
    00
  • ASP.NET中Webservice安全 实现访问权限控制

    在ASP.NET中使用WebService并保证安全性,需要实现访问权限控制。下面是实现这一目标的攻略,其中使用了两个示例。 1. 在Web.config文件中配置安全控制 在ASP.NET中,可以使用Web.config文件进行全局配置和安全控制。我们可以在Web.config文件中配置以下的内容,来限制WebService的访问权限: <syste…

    Java 2023年5月19日
    00
  • idea中创建jsp项目的详细实战步骤

    下面是在IDEA中创建JSP项目的详细实战步骤: 步骤一 创建项目 打开IDEA,点击“Create New Project”按钮。 选择“Java Enterprise”项目类型,然后点击“Next”。 在“Project SDK”下拉框中选择JDK版本,然后点击“Next”。 输入项目名称和项目路径,然后点击“Finish”。 步骤二 添加Web模块 打…

    Java 2023年6月15日
    00
  • java实现LRU缓存淘汰算法的方法

    Java实现LRU缓存淘汰算法的方法 什么是LRU缓存淘汰算法? LRU(Least Recently Used)是一种基于时间局部性原理的缓存置换策略,常用于CPU缓存、数据库缓存等场景。它的核心思想是:对于长期未被使用的缓存数据,它们被淘汰的概率更大。 在实际应用中,我们通常将缓存数据存储在一个链表中,每当我们访问缓存数据时,就将该数据移动到链表的头部,…

    Java 2023年5月19日
    00
  • JAVA实现异步调用实例代码

    JAVA实现异步调用实例代码攻略 什么是异步调用? 在Java中,我们经常需要调用一些时间较长的方法,比如网络请求、IO操作、复杂的计算等等。这些方法如果在主线程中执行,会导致界面假死、卡死等严重问题。这时候,我们就需要使用异步调用(Async Call)来解决这个问题。 异步调用指的是将一个方法的执行过程交给另一个线程来执行,然后直接返回结果,而不必等待方…

    Java 2023年5月18日
    00
  • Spring Security实现多次登录失败后账户锁定功能

    一、Spring Security实现多次登录失败后账户锁定功能的实现过程 配置登录失败处理器 在Spring Security的配置类中,通过实现 org.springframework.security.web.authentication.AuthenticationFailureHandler 接口,自定义一个登录失败处理器。 示例代码: @Conf…

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