Java后端图形验证码的使用

一、验证码使用逻辑

二、生成验证码

使用Kaptcha库生成验证码

这里使用的是后端调用Kaptcha库生成验证码的二进制字符串,传给前端,由前端转为图片

1、引入依赖

java 复制代码
		<dependency>
			<groupId>com.github.penggle</groupId>
			<artifactId>kaptcha</artifactId>
			<version>2.3.2</version>
		</dependency>

2、生成验证码

java 复制代码
// 生成验证码
String code = kaptchaProducer.createText();

3、根据文本生成验证码图片(BufferedImage对象)

java 复制代码
BufferedImage kaptchaImage = kaptchaProducer.createImage(code);

4、将图片转换为Base64

java 复制代码
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
ImageIO.write(kaptchaImage, "jpg", outputStream);
String base64Img = Base64.getEncoder().encodeToString(outputStream.toByteArray());

ByteArrayOutputStream:内存输出流,用于临时存储图片二进制数据。

ImageIO.write:将BufferedImage以JPEG格式写入输出流。

Base64编码:将二进制图片数据转换为Base64字符串,便于前端通过直接显示。

5、构造返回前端的响应

java 复制代码
Map<String, String> imgMap = new HashMap<>();
imgMap.put(key, "data:image/jpeg;base64," + base64Img);

返回值格式:生成一个键值对,例如:

java 复制代码
{ "captchaKey": "data:image/jpeg;base64,/9j/4AAQSkZJRgA..." }

key的作用:前端提交验证码时需携带此键,服务端通过它从缓存中获取正确的验证码文本。

6、缓存验证码

java 复制代码
Map<String, String> cacheMap = new HashMap<>();
cacheMap.put(CODE, code.toUpperCase());
captchaCache.putCaptcha(key, cacheMap);

Google Guava 缓存库实现的验证码缓存组件,用于在单节点部署环境中存储和验证验证码信息。

  1. 转换为大写:code.toUpperCase()使验证码不区分大小写(用户输入a3g7或A3G7均可通过)。
  2. 缓存逻辑:
  • CODE是常量(如"code"),作为缓存Map的键。
  • captchaCache是自定义缓存组件,将key与验证码文本关联,通常设置有效期
java 复制代码
@Override
public boolean putCaptcha(String key, Map<String, String> value) {
    try {
        cache.put(key, JSONObject.fromObject(value).toString());
    } catch (Exception ex) {
        return false;
    }
    return true;
}

三、验证验证码

一般在调用登录接口前验证验证码,通过SpringMVC的拦截器实现

1、验证验证码,判断是否为空

java 复制代码
		if(StringUtil.isEmpty(key)) {
			throw new BadRequestAlertException(ErrorConstants.CAPTCHA_TYPE, "The information of captcha is missing", "captcha.header", "missing");
		}

2、获取验证码(如果验证码过期则无法获取到)

java 复制代码
Map<String, String> validateMap = captchaCache.getCaptcha(key);

3、删除验证码缓存

java 复制代码
captchaCache.deleteCaptcha(key);

4、比较验证码的值

java 复制代码
		if(captcha.get(CODE).equalsIgnoreCase(validateMap.get(CODE))){
			return true;
		}
相关推荐
我好喜欢你~26 分钟前
C#---StopWatch类
开发语言·c#
桦说编程2 小时前
Java 中如何创建不可变类型
java·后端·函数式编程
lifallen2 小时前
Java Stream sort算子实现:SortedOps
java·开发语言
IT毕设实战小研2 小时前
基于Spring Boot 4s店车辆管理系统 租车管理系统 停车位管理系统 智慧车辆管理系统
java·开发语言·spring boot·后端·spring·毕业设计·课程设计
没有bug.的程序员3 小时前
JVM 总览与运行原理:深入Java虚拟机的核心引擎
java·jvm·python·虚拟机
甄超锋3 小时前
Java ArrayList的介绍及用法
java·windows·spring boot·python·spring·spring cloud·tomcat
cui__OaO3 小时前
Linux软件编程--线程
linux·开发语言·线程·互斥锁·死锁·信号量·嵌入式学习
阿华的代码王国3 小时前
【Android】RecyclerView复用CheckBox的异常状态
android·xml·java·前端·后端
Zyy~3 小时前
《设计模式》装饰模式
java·设计模式
A尘埃3 小时前
企业级Java项目和大模型结合场景(智能客服系统:电商、金融、政务、企业)
java·金融·政务·智能客服系统