# 如何实现验证码及校验

> 最讨厌的就是验证码了

发布：2025-12-29 | 分类：计算机 | 标签：后端、笔记


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

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

## 简单验证码

### 前置

- [easy-captcha](https://github.com/pig-mesh/easy-captcha)
- Redis

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

### 组件的基本使用

首先还是先在 maven 里引入

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

#### 后端代码

#### 简单的实现接口

```java
/**
 * 生成验证码
 */
@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
```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;
    }
}
````

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