惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Engineering at Meta
Engineering at Meta
Microsoft Azure Blog
Microsoft Azure Blog
I
InfoQ
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
人人都是产品经理
人人都是产品经理
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
T
Tailwind CSS Blog
MongoDB | Blog
MongoDB | Blog
Google DeepMind News
Google DeepMind News
WordPress大学
WordPress大学
量子位
美团技术团队
大猫的无限游戏
大猫的无限游戏
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Last Week in AI
Last Week in AI
博客园 - 司徒正美
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
小众软件
小众软件
C
Check Point Blog
博客园 - 三生石上(FineUI控件)
N
Netflix TechBlog - Medium
Recent Announcements
Recent Announcements
有赞技术团队
有赞技术团队
月光博客
月光博客

Lanke

Google 账号地区是日本,ChatGPT 订阅为什么还是美元? 在 Flutter 项目里折腾苹果的液态玻璃效果 从“宅斗庶女”看极端女权 一期一会 关于梦 用 Vercel AI Gateway 给博客做一个 AI 摘要服务 Claude 搜索网页报错:Unable to verify if domain is safe to fetch 的解决方法 Flutter输入面板布局优化:键盘、表情面板与@联想的丝滑切换 再谈语言和思维 还有人记得 在2026年拥有自己的博客 为 Astro 博客添加 llms.txt 使用 LLM Wiki 作为 Hermes Agent 的记忆系统 使用Obsidian 作为 Hermes Agent 的记忆数据库 流畅的下滑关闭页面 遇到的一起生产事故 好看的鼠标样式 拖了很久的更新,还是来了 Linux · 常用日志查询命令 面试 · Java面试二 面试 · Java面试一 在电脑上共存MySQL 三道前端题 「随便来点」失语症 一些碰到的面试问题 关于博客主题的自问自答 重装电脑后恢复MySQL数据 如何畅玩旮旯game之软件篇--串流 欢迎来到实力至上主义教室 谈“诚哥”之死
如何实现验证码及校验
Lanke · 2025-12-29 · via Lanke

如何实现验证码及校验

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

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

简单验证码

前置

其实不用 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;
    }
}

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

文章标题:如何实现验证码及校验

文章作者:Lanke

文章链接:https://blog.blueke.top/posts/487186[复制]

发布时间:


商业转载请联系站长获得授权,非商业转载请注明本文出处及文章链接,您可以自由地在任何媒体以任何形式复制和分发作品,也可以修改和创作,但是分发衍生作品时必须采用相同的许可协议。
本文采用CC BY-NC-SA 4.0进行许可。