验证码功能的思路和做法

验证码登录的思路和流程

步骤

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);
        }
    }
}
相关推荐
架构技术专栏11 小时前
Agent 工具调用:从工具声明到执行反馈
前端·人工智能·后端
别动我齐刘海12 小时前
C++ 工程化学习
java·linux·前端·c++·学习·机器学习·机器人
码事漫谈12 小时前
你让AI干的活,它可能只干了十分之一——而你根本看不出来
后端
Wx-bishekaifayuan12 小时前
express皖美特色农产品网售系统53118-计算机课程设计、毕业设计
人工智能·spring boot·后端·python·课程设计·express·旅游
Wx-bishekaifayuan13 小时前
springboot汉中旅游服务平台41442-计算机课程设计、毕业设计
spring boot·后端·python·django·课程设计·express·旅游
code2cat13 小时前
Java进阶篇之AtomicLongFieldUpdater:把累计额度留在对象字段中
java·cas·并发编程
WeiXin_DZbishe13 小时前
基于springboot城市公交实时运营与调度系统-计算机毕设 附源码【课程设计】66173
java·vue.js·spring boot·后端·python·php·课程设计
泡茶喝茶写代码13 小时前
A股量化数据工程:从 REST 接口到策略信号(第 18 篇):放量缩量异动扫描
java·python·股票数据api·股票数据api接口·股票api数据接口·股票量化数据api·股票量化数据接口
WeiXin_DZbishe14 小时前
基于Springboot+AI的kuall音乐广场的设计与实现-计算机毕设 附源码【课程设计】12715
vue.js·人工智能·spring boot·后端·python·php·课程设计