简单的EasyCaptcha图片验证码学习

news2024/9/22 1:00:19

简单的EasyCaptcha图片验证码学习

1. 需求

图片验证码是一种常见的验证形式,它通过生成一串随机数字或符号,并加入一些干扰像素,最终生成用于验证的图片。这种验证码的设计旨在增加破解难度,主要通过加大干扰强度来提高安全性。通过这种方式,图片验证码能够有效地防止密码被暴力猜解,从而提高登录客户账户的安全性。我想在项目登录的时候生成一个简单的图片验证码功能,所以进行了简单的调研,方便之后使用学习。

2. 工具介绍

2.1 简介

验证码部分有很多的工具类已经实现了,我们使用的时候不需要自己进行编写,直接使用工具类就好,此处我使用的是EasyCaptcha这个工具包进行生成验证码,他是一个Java图形验证码,支持gif、中文、算术等类型,可用于Java WebJavaSE等项目。我们项目使用的是前后端分离项目,所以此处我们便只讨论前后端分离部分的使用方法

2.2 实现的效果

  • 大写验证码
    在这里插入图片描述

  • gif验证码
    在这里插入图片描述

  • 算数类型验证码
    在这里插入图片描述

  • 中文类型验证码
    在这里插入图片描述

  • 切换展示字体(内置)
    在这里插入图片描述

2.3 引入方式

我们项目使用pom进行引入,具体引入坐标如下

<dependency>
    <groupId>com.github.whvcse</groupId>
    <artifactId>easy-captcha</artifactId>
    <version>1.6.2</version>
</dependency>

2.4 验证码字符展示类型

验证码展示类型可以在代码中自定义,具体可以使用charType 进行设置

// 构造器,参数长,高,验证字符个数
SpecCaptcha captcha = new SpecCaptcha(130, 48, 5);
captcha.setCharType(Captcha.TYPE_ONLY_NUMBER);
类型描述
TYPE_DEFAULT数字和字母混合
TYPE_ONLY_NUMBER纯数字
TYPE_ONLY_CHAR纯字母
TYPE_ONLY_UPPER纯大写字母
TYPE_ONLY_LOWER纯小写字母
TYPE_NUM_AND_UPPER数字和大写字母

2.5 字体设置

EasyCaptcha 当前可以设置多种字体,包含他定义10种字体以及系统默认支持的字体,可以使用font属性进行设置,具体使用方式以及具体字体如下:

// 构造器,参数长,高,验证字符个数
SpecCaptcha captcha = new SpecCaptcha(130, 48, 5);
// 设置内置字体
captcha.setFont(Captcha.FONT_1);
// 设置系统字体
captcha.setFont(new Font("楷体", Font.PLAIN, 28)); 

在这里插入图片描述

2.6 输出形式

我们可以将验证码图片转义成base64字符串输出,也可以转换为本地图片进行输出

  • base64字符串输出

    // 构造器,参数长,高,验证字符个数
    SpecCaptcha specCaptcha = new SpecCaptcha(130, 48, 5);
    specCaptcha.toBase64();
    
    // 如果不想要base64的头部data:image/png;base64,
    specCaptcha.toBase64("");  // 加一个空的参数即可
    
  • 文件输出

    FileOutputStream outputStream = new FileOutputStream(new File("d:/pic/validate.png"))
    // 构造器,参数长,高,验证字符个数
    SpecCaptcha specCaptcha = new SpecCaptcha(130, 48, 5);
    specCaptcha.out(outputStream);
    

3.测试

我们编写本地测试类进行测试,我们使用的是前后端分离,暂时是一个简单的测试案例,如果想要验证码有失效时间,则需要我们使用redisexpire功能,设定一个过期时间添加一个简单的过期验证即可,此处不多赘述。具体的测试过程如下:

  1. 在spring boot项目中引入工具类坐标

     <dependency>
         <groupId>com.github.whvcse</groupId>
         <artifactId>easy-captcha</artifactId>
         <version>1.6.2</version>
     </dependency>
    
  2. 编写测试类ValidatePicController

    package cn.git.controller;
    
    import com.wf.captcha.ArithmeticCaptcha;
    import com.wf.captcha.ChineseCaptcha;
    import com.wf.captcha.ChineseGifCaptcha;
    import com.wf.captcha.SpecCaptcha;
    import com.wf.captcha.base.Captcha;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    import java.awt.*;
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    
    /**
     * @description: 验证码工具controller
     * @program: bank-credit-sy
     * @author: lixuchun
     * @create: 2023-05-03
     */
    @RestController
    @RequestMapping("/validate")
    public class ValidatePicController {
    
        /**
         * 生成验证码图片
         * @return
         */
        @GetMapping("/pic")
        public String pic() throws IOException, FontFormatException {
            // 图片的宽度,高度以及字符个数
            SpecCaptcha specCaptcha = new SpecCaptcha(130,48,4);
            specCaptcha.setFont(Captcha.FONT_10);
            System.out.println("随机验证码为 : " + specCaptcha.text());
    
            // 将验证码图片下载到本地
            File file = new File("D:\\pic\\" + System.currentTimeMillis() + ".png");
            specCaptcha.out(new FileOutputStream(file));
    
            // 获取中文验证码,参数为图片的宽度,高度以及字符个数
            ChineseCaptcha chineseCaptcha = new ChineseCaptcha(130, 48);
            File file2 = new File("D:\\pic\\" + System.currentTimeMillis() + ".png");
            chineseCaptcha.out(new FileOutputStream(file2));
            System.out.println("中文验证码为 : " + chineseCaptcha.text());
    
            // 获取中文gif验证码
            ChineseGifCaptcha chineseGifCaptcha = new ChineseGifCaptcha(130, 48);
            // 将验证码图片下载到本地
            File file3 = new File("D:\\pic\\" + System.currentTimeMillis() + ".gif");
            chineseGifCaptcha.out(new FileOutputStream(file3));
            System.out.println("中文gif验证码为 : " + chineseGifCaptcha.text());
    
            // 算数图验证码
            ArithmeticCaptcha captcha = new ArithmeticCaptcha(130, 48);
            // 几位数运算,默认是两位
            captcha.setLen(3);
            // 获取运算的公式, eg: 5+6=?
            System.out.println("算数验证表达式为 : " + captcha.getArithmeticString());
            // 获取运算的结果
            captcha.text();
            System.out.println("算数验证码为 : " + captcha.text());
            // 将验证码图片下载到本地
            File file4 = new File("D:\\pic\\" + System.currentTimeMillis() + ".png");
            captcha.out(new FileOutputStream(file4));
    
            return "success";
        }
    
    }
    
    
  3. 浏览器访问测试

    我们使用浏览器进行接口访问 http://localhost:8088/validate/pic ,查看结果已经返回,那么我们看下后台以及本地生成图片是否正确
    在这里插入图片描述
    后台以及本地生成文件展示如下: 在这里插入图片描述
    在这里插入图片描述

    • 随机验证码 cC8J
      在这里插入图片描述
    • 中文验证码 起掉座那
      在这里插入图片描述
    • 中文gif验证码 门也老穿
      在这里插入图片描述
    • 算数验证码 8 * 5 - 0 = ?,结果40
      在这里插入图片描述

原项目地址为:https://gitee.com/ele-admin/EasyCaptcha

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2100430.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何在 Vue 中创建一个带有表格和表单的弹窗

本文将通过一个具体的示例来介绍如何在 Vue 应用中实现一个带有表格和表单功能的弹窗组件。我们将使用 Element UI 库中的 el-dialog 组件来构建这个弹窗&#xff0c;并结合 el-table 和 el-form 来展示数据并允许用户进行编辑。 效果图&#xff1a; 完整代码最底部&#xff0…

火语言RPA流程组件介绍--文件系统监控

&#x1f6a9;【组件功能】&#xff1a;监控指定文件夹或文件的创建、变更删除等事件 配置预览 配置说明 事件类型 “异步回调处理”、“同步等待”2种类型供选择。流程是否等待发生监控文件的创建、变更、删除事件&#xff0c;异步不等待&#xff0c;同步则等待。 监控文件…

MySQL创建数据库和表应用教程

前言 MySQL 是一种流行的关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;广泛应用于 web 应用开发中。以下是一个简单的 MySQL 创建数据库和表的教程&#xff0c;涵盖了基本步骤。假设你已经安装了 MySQL 并且能够通过命令行或 MySQL Workbench 等工具访问它。…

【网络安全】服务基础第一阶段——第五节:Windows系统管理基础---- DHCP部署与安全

目录 一、DHCP协议 理解DHCP握手&#xff1a; 分配IP地址方式&#xff1a; DHCP协议报文的种类&#xff1a; DHCP协议工作过程&#xff1a; ​编辑DHCP四个阶段&#xff1a; 续约租期&#xff1a; 重新连接使用IP地址&#xff1a; DHCP安全性&#xff1a; 二、DHCP中继…

海龟交易系统所代表的传统CTA策略是不是过时了?

原创内容第639篇&#xff0c;专注量化投资、个人成长与财富自由。 量化投资具体步骤&#xff1a;数据、指标&#xff08;因子&#xff09;&#xff0c;信号规则或因子合成&#xff0c;策略&#xff0c;绩效评估&#xff0c;风控。 其实所有的策略都可以归结为以上的步骤。 我…

Redis 篇-深入了解查询缓存与缓存所带来的问题(读写不一致、缓存穿透、缓存雪崩、缓存击穿)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 本章目录 1.0 什么是缓存 2.0 项目中具体如何添加缓存 3.0 添加缓存后所带来的问题 3.1 读写不一致问题 3.1.1 缓存更新策略 3.1.2 具体实现缓存与数据库的双写一致 3.2 缓存穿…

DAC专用功能芯片TI DAC8562/8563

DAC8563具有 2.5V、4ppm/C 基准的 16 位、双通道、低功耗、超低短时脉冲波形干扰、缓冲电压输出 DAC。 DAC8562是一款16位、双通道、串行接口的DAC&#xff0c;采用SPI接口进行通信&#xff0c;具有内部参考电压、软件可编程增益和输出保护等功能。 一、DAC8563的主要参数 供…

JVM面试(二)内存区域划分

内存区划分 Java虚拟机在执行Java程序的过程中会把它锁管理的内存划分为若干个不同的数据区域。 这些区域有各自不同的用途&#xff0c;以及创建和销毁的时间。 有的区域随着虚拟机的进程一直存在&#xff0c;有的区域依赖用户线程的启动和结束而建立和销毁。 根据《Java虚拟…

YOLOv8 训练15种动物分类模型

1. 下载数据集 https://hyper.ai/datasets/31084 2. 进行训练 这里数据集没做拆分&#xff0c;训练测试都是同一个数据集。 train.py:python from ultralytics import YOLO from ultralytics.utils import DEFAULT_CFG from datetime import datetimecurrent_time datetim…

2.1CPU内部结构

&#x1f393; 微机原理考点专栏&#xff08;通篇免费&#xff09; 欢迎来到我的微机原理专栏&#xff01;我将帮助你在最短时间内掌握微机原理的核心内容&#xff0c;为你的考研或期末考试保驾护航。 为什么选择我的视频&#xff1f; 全程考点讲解&#xff1a;每一节视频都…

利用深度学习实现验证码识别-3-ResNet18

在当今数字化时代&#xff0c;验证码作为一种重要的安全验证手段&#xff0c;广泛应用于各种网络场景。然而&#xff0c;传统的验证码识别方法往往效率低下&#xff0c;准确率不高。今天&#xff0c;我们将介绍一种基于 ResNet18 的验证码识别方法&#xff0c;它能够高效、准确…

AI大模型优化技巧:参数高效微调(PEFT)与LoRA微调深度解析

1. Fine-tuning 相较于基础大模型动辄万卡的代价&#xff0c;微调可能是普通个人或者企业少数能够接受的后训练大模型(post-training)的方式。 微调是指在一个预训练模型(pre-training)的基础上&#xff0c;通过少量的数据和计算资源&#xff0c;对模型进行进一步训练&#x…

阿里巴巴数学竞赛成绩未公布:背后的权衡与期待

文 | 头部财经首席评论员白立新 发布 | 头部财经 top168.com 导语&#xff1a;2024 年阿里巴巴数学竞赛成绩迟未公布&#xff0c;引发广泛猜测。中专生姜萍的表现备受瞩目&#xff0c;达摩院陷入两难困境。这场竞赛结果的公布&#xff0c;关乎多方利益与社会影响&#xff0c;…

UML(ER) manual book

图形与符号 实体 真实世界的表示&#xff08;实物&#xff09;&#xff0c;负责数据的发送或者接收&#xff0c;通常使用矩形表示。 处理和加工 通常使用圆圈表示数据时如何被处理&#xff0c;比如下订单&#xff0c;付款等动作。 数据存储 通常使用两条平行线表示&…

碲化镉太阳能电池:绿色能源的新星,高效转换引领未来

随着全球对清洁能源需求的持续增长和技术的不断进步&#xff0c;碲化镉太阳能电池必将在未来的能源市场中占据重要地位。‌‌PicoQuant公司一直致力于碲化镉太阳能电池新材料、‌新工艺的探索与研发&#xff0c;充分利用其在时间分辨技术上的优势&#xff0c;‌为碲化镉太阳能电…

5、LVGL控件-滑轮、滑动条、圆弧

本篇文章目录导航 ♠♠ LVGL控件-滑轮、滑动条、圆弧 ♣♣♣♣ 一、LVGL 滑轮部件 ♦♦♦♦♦♦♦♦ 1.1 滑轮部件组成部分 ♦♦♦♦♦♦♦♦ 1.2 滑轮部件基本API ♦♦♦♦♦♦♦♦ 1.3 实验小演示 ♣♣♣♣ 二、LVGL 滑动条部件 ♦♦♦♦♦♦♦♦ 2.1 滑动条部件组成部分 ♦…

论文阅读:MambaVision: A Hybrid Mamba-Transformer Vision Backbone

论文地址&#xff1a;arxiv 摘要 作者提出了一种新型的混合 Mamba-Transformer 主干网络。通过重新设计 Mamba 公式&#xff0c;增强了其高效建模视觉特征的能力。 此外&#xff0c;作者还通过对 ViT 与 Mamba 消融研究&#xff0c;实验结果表明了&#xff1a;在最后几层为 …

“双碳”减排背景下企业自发电系统该具备哪些功能?

随着全球能源危机加剧、用能需求上升以及新能源技术的迅速发展&#xff0c;新能源发电的应用范围不断扩大&#xff0c;并逐步形成了新型能源与电力市场。然而&#xff0c;由于新能源的能量密度普遍较低&#xff0c;进行大规模发电时需精心挑选适合的位置&#xff0c;因此新能源…

【网络安全】服务基础第一阶段——第九节:Windows系统管理基础---- Windows_AD域

目录 一、域与活动目录 1.1 工作组 1.2 域 1.2.1 域&#xff08;Domain&#xff09; 1.2.2 域控制器&#xff08;Domain Controller&#xff0c;DC&#xff09; 1.2.3 功能和角色 1.2.4 管理和监控 1.2 5 域结构 1.3 组织单元&#xff08;Organizational Unit&#xff…

Seata 的4种事务模式(XA、AT、TCC、SAGA)

目录 前言 Seata架构 事务模式 XA AT TCC 区别 前言 在分布式系统中&#xff0c;实现一个功能可能需要由几个不同的服务来共同实现。这就会带来一个问题&#xff0c;不同的服务之间无法做到使用同一个事务&#xff0c;这就无法保证数据的一致性了。在一些对数据一致性要…