Easy-Captcha验证码 生成以及校验(简单易懂)

目录

  • 说明
  • pom引入
  • 详解参数类使用
    • easy-captcha 中提供了下面几种类
    • 源码说明
  • Captcha使用
  • 验证图解
  • 源码测试GitHub

说明

Java图形验证码,支持gif、中文、算术等类型,可用于Java Web、JavaSE等项目

pom引入

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

详解参数类使用

easy-captcha 中提供了下面几种类

类名说明图片
ArithmeticCaptcha数字加减乘除验证在这里插入图片描述
ChineseCaptcha中文验证在这里插入图片描述
ChineseGifCaptcha中文动态验证在这里插入图片描述
GifCaptcha动态字符验证在这里插入图片描述
SpecCaptcha字符验证在这里插入图片描述
CaptchaUtil输出类

源码说明

在上面的类中,都是继承自Captcha类,类中提供了两个主要抽象方法,自定义验证码生成器也需继承Captcha,实现下面两个方法。

   public abstract boolean out(OutputStream var1);public abstract String toBase64();

来看SpecCaptcha 默认生成验证码的工具类,其他几种验证码生成类,一样的逻辑。

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//package com.wf.captcha;import com.wf.captcha.base.Captcha;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.OutputStream;
import javax.imageio.ImageIO;public class SpecCaptcha extends Captcha {//空构造方法public SpecCaptcha() {}//设置验证码的长宽public SpecCaptcha(int width, int height) {this();this.setWidth(width);this.setHeight(height);}
//设置验证码的长宽,和生成验证码的长度public SpecCaptcha(int width, int height, int len) {this(width, height);this.setLen(len);}
//设置验证码的长宽,和生成验证码的长度,以及字体public SpecCaptcha(int width, int height, int len, Font font) {this(width, height, len);this.setFont(font);}// 验证码返回public boolean out(OutputStream out) {return this.graphicsImage(this.textChar(), out);}
//验证码转为base64public String toBase64() {return this.toBase64("data:image/png;base64,");}//生成验证码逻辑private boolean graphicsImage(char[] strs, OutputStream out) {try {BufferedImage bi = new BufferedImage(this.width, this.height, 1);Graphics2D g2d = (Graphics2D)bi.getGraphics();g2d.setColor(Color.WHITE);g2d.fillRect(0, 0, this.width, this.height);g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);this.drawOval(2, g2d);g2d.setStroke(new BasicStroke(2.0F, 0, 2));this.drawBesselLine(1, g2d);g2d.setFont(this.getFont());FontMetrics fontMetrics = g2d.getFontMetrics();int fW = this.width / strs.length;int fSp = (fW - (int)fontMetrics.getStringBounds("W", g2d).getWidth()) / 2;for(int i = 0; i < strs.length; ++i) {g2d.setColor(this.color());int fY = this.height - (this.height - (int)fontMetrics.getStringBounds(String.valueOf(strs[i]), g2d).getHeight() >> 1);g2d.drawString(String.valueOf(strs[i]), i * fW + fSp + 3, fY - 3);}g2d.dispose();ImageIO.write(bi, "png", out);out.flush();boolean var20 = true;return var20;} catch (IOException var18) {var18.printStackTrace();} finally {try {out.close();} catch (IOException var17) {var17.printStackTrace();}}return false;}
}

Captcha使用

以上几种提供的工具类,都有使用测试

package com.test.execption.controller;import com.ramostear.captcha.HappyCaptcha;
import com.wf.captcha.*;
import com.wf.captcha.utils.CaptchaUtil;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;/*** 类描述:EasyCaptcha 验证码工具** @author admin* @date 2023-01-02 17:47**/@RestController
@RequestMapping(value = "captcha")
public class EasyCaptchaController {/*** 生成字符串验证码** @param request* @param response* @return*/@GetMapping(value = "generatorStr")public void generator(HttpServletRequest request, HttpServletResponse response) {try {CaptchaUtil.out(request, response);} catch (IOException e) {throw new RuntimeException(e);}}/*** 生成数字验证码** @param request* @param response* @return*/@GetMapping(value = "generatorNum")public void generatorNum(HttpServletRequest request, HttpServletResponse response) {try {ArithmeticCaptcha arithmeticCaptcha = new ArithmeticCaptcha(200, 250);arithmeticCaptcha.setLen(2);CaptchaUtil.out(arithmeticCaptcha, request, response);} catch (IOException e) {throw new RuntimeException(e);}}/*** 生成中文验证码** @param request* @param response* @return*/@GetMapping(value = "generatorChinese")public void generatorChinese(HttpServletRequest request, HttpServletResponse response) {try {ChineseCaptcha chineseCaptcha = new ChineseCaptcha(200, 250);chineseCaptcha.setLen(2);CaptchaUtil.out(chineseCaptcha, request, response);} catch (IOException e) {throw new RuntimeException(e);}}/*** 生成中文动态验证码** @param request* @param response* @return*/@GetMapping(value = "generatorChineseGif")public void generatorChineseGif(HttpServletRequest request, HttpServletResponse response) {try {ChineseGifCaptcha chineseGifCaptcha = new ChineseGifCaptcha(200, 250);chineseGifCaptcha.setLen(2);CaptchaUtil.out(chineseGifCaptcha, request, response);} catch (IOException e) {throw new RuntimeException(e);}}/*** 生成字符动态验证码** @param request* @param response* @return*/@GetMapping(value = "generatorGif")public void generatorGif(HttpServletRequest request, HttpServletResponse response) {try {GifCaptcha captcha = new GifCaptcha(200, 250);captcha.setLen(2);CaptchaUtil.out(captcha, request, response);} catch (IOException e) {throw new RuntimeException(e);}}/*** 生成字符动态验证码* 这个为默认验证码生成器* @param request* @param response* @return*/@GetMapping(value = "generatorSpec")public void generatorSpec(HttpServletRequest request, HttpServletResponse response) {try {SpecCaptcha captcha = new SpecCaptcha(200, 250);captcha.setLen(2);CaptchaUtil.out(captcha, request, response);} catch (IOException e) {throw new RuntimeException(e);}}/*** 验证码校验,并且验证通过后清除,下次不允许再用** @param verifyCode* @param request* @return*/@GetMapping("/verify")public String verify(String verifyCode, HttpServletRequest request) {Boolean aBoolean = CaptchaUtil.ver(verifyCode, request);if (aBoolean) {CaptchaUtil.clear(request); //清除验证码return "通过";}return "不通过";}

验证图解

使用数字运算验证

生成验证码:
在这里插入图片描述
校验验证码:
结果不对,不通过
在这里插入图片描述
结果正确,通过
在这里插入图片描述

源码测试GitHub

github 测试代码

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

验证码生成原理即Python代码实现

验证码的生成步骤&#xff1a; 方法一&#xff1a;1.关键在于random能随机获取 2.首先建立一个字符串包含0-9&#xff0c;A-z&#xff08;可根据实际要求添加字符&#xff09;&#xff0c;命名为Number 3.一般验证码是既定长度&#xff0c;我们这里使用4-6位随机长度验证码&…

关于 小红书 x-sign 的数据的破解

该文章主要提供交流学习使用&#xff0c;请勿利用其进行不当行为&#xff01; 如本篇文章侵犯了贵公司的隐私&#xff0c;请联系我立刻删除&#xff01; 由于最近比较忙&#xff0c;暂时没有更新&#xff0c;这段时间会及时更新的 在获取 小红书 x-sign 时候发现数据为必须添…

邮箱发送验证码和短信发送验证码的学习笔记

邮箱发送验证码 //邮箱验证码public static boolean sendEmail(String emailaddress,String code) {try {HtmlEmail email new HtmlEmail();//不用更改email.setHostName("smtp.qq.com");// 发件者的邮箱 需要修改&#xff0c;126邮箱为smtp.126.com,163邮箱为smtp…

Kaptcha生成图片验证码

Kaptcha简介 kaptcha 是一个很有用的验证码生成工具。由于它是可配置的&#xff0c;有了它&#xff0c;你能够生成各种样式的验证码。 Kaptcha 是一个可高度配置的实用验证码生成工具&#xff0c;可自由配置的选项如&#xff1a; 验证码的字体验证码字体的大小验证码字体的字…

前后端分离java开发图形验证码+谷歌开源Kaptcha使用(Springboot+redis实现图形验证码校验)

文章目录 1.背景1.1 什么是短信-邮箱轰炸机1.2 公司带来的损失 2.如何避免自己的网站成为"肉鸡“或者被刷呢3.表单重复提交问题4.Kaptcha框架介绍5.前后端分离验证码实战开发-思路分析6.前后端分离验证码实战开发-后端代码5.1 pom.xml核心依赖5.2 KaptchaConfig配置类5.3 …

Qt音乐播放器实现(带歌词功能)

最近期末项目要写一个音乐播放器&#xff0c;作为新人头疼了好久&#xff0c;参考了各方文档&#xff0c;总算憋出来了一个&#xff0c;歌词功能用的是一个大佬实现的&#xff0c;然后我就调用了&#xff0c;就是我那个lyricwidget.cpp和头文件就是直接弄过来的&#xff0c;但是…

JavaWeb音乐网站开发:Ajax异步获取歌词文件并显示,以及实现音频与歌词对应同步的方法

在开发音乐网站或APP的时候&#xff0c;都必须要面对这一个问题&#xff1a;如何让正在播放的歌曲的歌词与音频对应&#xff1f;也就是歌曲正在唱哪一句对应显示这一句的歌词&#xff1f;这便是今天这篇博客主要谈论的主题&#xff0c;先抛开爬虫爬取这一说&#xff0c;今天讲的…

Android解析lrc里的歌词

解析记歌词的类。这是解析.lrc文件里的歌词。 解析歌词使用的是输入流&#xff0c;然后吧歌词和歌词时间放在JavaBean的列表里。具体代码如下&#xff1a; package com.zzm.android.Handler;import java.io.BufferedReader; import java.io.File; import java.io.FileInputStr…

iPhone上的lrc播放器可以在播放mp3文件时显示歌词

https://apps.apple.com/cn/app/%E6%96%B0lrc%E6%92%AD%E6%94%BE%E5%99%A82/id1535214306 长久以来&#xff0c;在iPhone上播放lrc字幕一直是一个大的问题。因为苹果自带的音乐播放器不支持lrc歌词字幕&#xff0c;而市面上也少有支持lrc歌词字幕的音乐播放器App。 现在&…

音乐歌词同步实现指南

有道友问了我这个问题&#xff0c;所以在这写了下思路首先&#xff0c;我默认你至少已经了解了h5的audio标签的相关属性&#xff0c;直入正题audio使用指南audio标签audio之HTML 事件属性 old歌词 一般的说&#xff0c;lyric文件由时间的tag标签组成&#xff0c;如截图所示 现在…

把乐谱换成c语言程序的软件,有没有什么软件可以把音乐换成简谱?

一、下载&#xff1a; 1。先把WAV或MP3转换成MIDI 下载地址&#xff1a; http://www.skycn.com/soft/10460.html 2。再把MIDI转成五线谱 下载地址&#xff1a; http://soft.pcnow.com.cn/soft/17237.shtml 二、安装&#xff1a; 1。安装MP3转MIDI工具&#xff0c;一直点下一步即…

安卓文字绘制和歌词器的简单实现

文章目录 安卓绘制文本的细节和歌词动画实战绘制简单文本绘制API绘制线设计多条线的原因 中心绘制x轴居中align居中宽度居中 正中心绘制 动画绘制原理过度绘制解决过度绘制 Demo点赞评论找我要哦 安卓绘制文本的细节和歌词动画实战 绘制文本有许多细节&#xff0c;这篇文章从绘…

歌词同步

歌词同步 前面的话歌词同步的需求歌词加载歌词显示歌曲播放时歌词的滚动计算歌词滚动范围如何同步歌词的滚动细节计算 鼠标拖拽时歌词的滚动自由滚动歌词 源码 前面的话 最近发现我们班同学做了一个很酷的Demo&#xff0c;这个Demo实现了一个很不错的歌词同步&#xff0c;着实…

终于等到你!Guitar Pro 8.1版本简谱功能首发

Guitar Pro是一款非常流行的音乐制谱软件它不仅适用于吉他谱还可以用于其他乐器的制谱。历经5年多时间研发Guitar Pro 在2022年正式发布了全新的8系列版本时隔不到1年Guitar Pro又给广大中国用户带来期盼已久的简谱功能下面让我带领大家一起体验吧 软件souurl.cn/BPln7d 图1 G…

人工智能火爆 国内这几家计算机视觉公司值得关注

&#xfeff;&#xfeff; 人工智能自降生以来就仿佛自带光环、备受瞩目。尤其是今年&#xff0c;国务院印发的《新一代人工智能发展规划》中提出&#xff0c;到2030年使中国人工智能理论、技术与应用总体达到世界领先水平&#xff0c;成为世界主要人工智能创新中心&#xff0c…

国内最值得关注的10家人工智能语音识别公司

在谈人工智能的时候&#xff0c;一定不能不谈语音识别&#xff0c;语音识别是人机交互的入口&#xff0c;是指机器/程序接收、解释声音&#xff0c;或理解和执行口头命令的能力。目前国内外都有公司在语音领域有所投入&#xff0c;其中包括才成立几年的初创企业&#xff0c;也包…

运气好到了一品

今天运气好&#xff0c;连续几把都赢了&#xff0c;一口气从布衣五品冲上了智贤一品&#xff0c;纪念一下。

到了智贤一品

朋友今天运气不错&#xff0c;今天连续打几把&#xff0c;都赢了&#xff0c;所以品级从智贤五品一路升级到了智贤一品&#xff0c;他很开心&#x1f601;。

之伏一品纪念

昨天运气不错&#xff0c;玩了几把&#xff0c;结果巴巴赢&#xff0c;从智贤一品升级到了之伏五品&#xff0c;之伏往升级的需要赢的次数就更多了&#xff0c;我感觉自己没啥希望了&#xff0c;有一个已经非常满足了。因为再过两个月会重新排名&#xff0c;重新从零开始升级。…