如何实现验证码及校验

发布于 2025-12-29
更新于 2025-12-29
约 550 字
3 分钟阅读
AI摘要

正在生成中...

虽然说本人不太喜欢在项目中加入各种各样的验证,但在实际项目里,这确实是很重要的部分,不仅能阻挡一部分的人机注册,也能筛选用户 (bushi)

本文简单的探索一下 SpringBoot 如何简单的实现图片验证码功能

简单验证码

前置

其实不用 Redis,使用 Session也能实现,但是现在一般都需要中间件

组件的基本使用

首先还是先在 maven 里引入

<dependencies>
<dependency>
<groupId>com.pig4cloud.plugin</groupId>
<artifactId>captcha-spring-boot-starter</artifactId>
<version>2.2.5</version>
</dependency>
</dependencies>

后端代码

简单的实现接口

/**
* 生成验证码
*/
@RequestMapping("/checkCode")
public ResponseVO checkcode() {
// 定义验证码的长宽,以及算数类型
ArithmeticCaptcha captcha = new ArithmeticCaptcha(100, 42);
// 获取运算的结果
String code = captcha.text();
//存入Redis
String checkCodeKey = redisComponent.saveCheckCode(code);
//输出base64编码
String checkCodeBase64 = captcha.toBase64();
//将图片和Key都返回给前端
Map<String, String> result = new HashMap<>();
result.put("checkCode", checkCodeBase64);
result.put("checkCodeKey", checkCodeKey);
return getSuccessResponseVO(result);
}

Redis 方法

Redis 需要一些方法,为验证码设置缓存时间,验证结果等。

这里是简易示例,因为我 RedisUtils 里包装了一些额外的工具参数,篇幅很长,不方便展示。

```java
@Component
public class RedisComponent {
@Autowired
private StringRedisTemplate stringRedisTemplate;
/**
* 保存验证码到 Redis
* @param code 验证码内容
* @return 验证码对应的唯一 key
*/
public String saveCheckCode(String code) {
// 生成唯一 key
String key = "checkCode:" + UUID.randomUUID().toString().replace("-", "");
// 保存到 Redis,并设置过期时间(例如 5 分钟)
stringRedisTemplate.opsForValue().set(key, code, 5, TimeUnit.MINUTES);
return key;
}
/**
* 根据 key 获取验证码
* @param key 验证码 key
* @return 验证码内容
*/
public String getCheckCode(String key) {
return stringRedisTemplate.opsForValue().get(key);
}
/**
* 删除验证码(验证成功后清理)
* @param key 验证码 key
*/
public void deleteCheckCode(String key) {
stringRedisTemplate.delete(key);
}
/**
* 校验验证码是否正确
* @param key 验证码 key
* @param code 用户输入的验证码
* @return true 正确,false 错误
*/
public boolean validateCheckCode(String key, String code) {
String storedCode = getCheckCode(key);
if (storedCode == null) {
return false; // 验证码不存在或已过期
}
boolean isValid = storedCode.equals(code);
if (isValid) {
deleteCheckCode(key); // 验证成功后立即删除
}
return isValid;
}
}

然后我们在注册、登录等场景,便可以使用这些方法,进行获取和校验。

阅读量: --
评论数:--