验证码功能的思路和做法

验证码登录的思路和流程

步骤

1.导入依赖

复制代码
<dependency>
    <groupId>com.github.axet</groupId>
    <artifactId>kaptcha</artifactId>
    <version>0.0.9</version>
</dependency>

2.写一个验证码的配置类

复制代码
package com.lzy.config;

import cn.hutool.json.JSON;
import cn.hutool.json.JSONObject;
import com.google.code.kaptcha.impl.DefaultKaptcha;
import com.google.code.kaptcha.util.Config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.Properties;

@Configuration
public class KaptchaConfig {
   @Bean
   public DefaultKaptcha producer() {
      //验证码长宽高
      Properties properties = new Properties();
      properties.put("kaptcha.border", "no");
      properties.put("kaptcha.textproducer.font.color", "black");
      properties.put("kaptcha.textproducer.char.space", "4");
      properties.put("kaptcha.image.height", "40");
      properties.put("kaptcha.image.width", "120");
      properties.put("kaptcha.textproducer.font.size", "30");
      Config config = new Config(properties);
      DefaultKaptcha defaultKaptcha = new DefaultKaptcha();
      defaultKaptcha.setConfig(config);
      return defaultKaptcha;
   }
}

3.使用这个类,创建一个uuid作为key,并得到一个随机验证码,再将验证码转化为图片,再转化为base64进制,并且按上对应的前缀

复制代码
package com.lzy.controller;

import cn.hutool.json.JSONObject;
import com.lzy.common.lang.Result;
import com.lzy.util.Constants;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Base64;
import java.util.UUID;

@RestController
public class CaptureController extends BaseController {

    @GetMapping("/captcha")
    public Result captcha() {
        // 生成uuid作为验证码的唯一标识
        UUID uuid = UUID.randomUUID();
        // 生成验证码
        String text = producer.createText();
        BufferedImage image = producer.createImage(text);
        String base64Image = convertImageToBase64(image);
        // 将验证码存入redis
        redisUtil.hset(Constants.CAPTURE , uuid.toString(), text, 120);
        JSONObject jsonObject = new JSONObject();
        jsonObject.set("token", uuid.toString());
        jsonObject.set("captchaImg", base64Image);
        return Result.success(jsonObject);
    }
    private String convertImageToBase64(BufferedImage image) {
        try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
            ImageIO.write(image, "png", baos);
            byte[] imageBytes = baos.toByteArray();
            String base64Image = Base64.getEncoder().encodeToString(imageBytes);
            return "data:image/png;base64," + base64Image;
        } catch (IOException e) {
            throw new RuntimeException("Error converting image to Base64", e);
        }
    }
}
相关推荐
wljt2 分钟前
公司二-面试题
java·开发语言·mybatis
AI备案指南-满满14 分钟前
算法备案审核不通过,一般是什么原因?
java·人工智能·算法·大模型备案·算法备案·大模型登记
IT_陈寒21 分钟前
SpringBoot多环境配置把我坑惨了,这个踩坑经验你最好看看
前端·人工智能·后端
秋天的怀念_David27 分钟前
算法一千零一夜 · 第二十三夜 电力民生写成的曲线
java·程序人生·算法
码事漫谈44 分钟前
DeepSeek 搞了个 "Super-agent",但不是超级智能
后端
吴名氏.1 小时前
Java转AI Agent教程(第五周)Prompt工程
java·人工智能·prompt·ai agent
吴凡wudianmei1 小时前
从 0 搭一个 AI Agent(四):SSE 跑通之后,三处“契约错配”与它们的修复边界
前端·后端·aigc
8Qi81 小时前
DDD架构演进
java·分布式·mvc·ddd
paopaokaka_luck1 小时前
灾害应急物资管理系统(AI应急助手、Echarts可视化数据看板、捐赠入库联动、 物资全流程管理、库存变动追溯、灾情资讯与互动反馈、物资发放公示)
java·前端·javascript·spring boot·mysql·tomcat·echarts
小兔子1 小时前
defer 的参数在写下那一刻就求值了,循环里这样写会踩坑
后端