
🔥系列专栏:《spring boot实战》
🌊山高路远,行路漫漫,终有归途。
目录
本文衔接上文,请从上文开始
上文我们已经整合好了jwt,本文我们开始实现图形验证码接口的实现。
- 通过糊涂工具包的图形验证码工具完成获取验证码接口
- 通过redis缓存key(验证码id)-value(验证码内容)
pom.xml:
- <dependency>
- <groupId>cn.hutoolgroupId>
- <artifactId>hutool-allartifactId>
- <version>5.8.25version>
- dependency>
前端的登录表单有个验证码id字段,第一次打开登录页面默认会请求验证码接口,那么后端验证码接口将返回验证码图片的base64编码和验证码id,前端需要将验证码id保存到表单对象的验证码id字段,同时把验证码图片显示。用户填写账密、验证码点击登录,表单对象将携带账密和验证码id和用户键入的验证码内容提交到后端,后端需要根据此验证码id去查redis跟用户提交的比对。
分析完我们就可以知道怎样设计这个接口了。
接口接收一个验证码id参数,判断这个参数如果是null则生成一个验证码id,不为null则直接拿它去生成redis缓存验证码内容的key,接着将验证码图片同id返回给前端。
首先定义验证码接口数据对象
- import lombok.Builder;
- import lombok.Data;
-
- /**
- * @author mijiupro
- */
- @Data
- @Builder
- public class CaptchaVO {
- //验证码id
- private String captchaId;
- //验证码图片base64编码
- private String captchaImage;
- }
这里用到了redis,需要整合好:
- import cn.hutool.captcha.CaptchaUtil;
- import cn.hutool.captcha.CircleCaptcha;
- import com.mijiu.commom.model.vo.CaptchaVO;
- import io.swagger.v3.oas.annotations.Operation;
- import io.swagger.v3.oas.annotations.tags.Tag;
- import org.springframework.data.redis.core.StringRedisTemplate;
- import org.springframework.web.bind.annotation.GetMapping;
- import org.springframework.web.bind.annotation.RequestMapping;
- import org.springframework.web.bind.annotation.RestController;
-
- import java.util.Optional;
- import java.util.UUID;
- import java.util.concurrent.TimeUnit;
-
- /**
- * @author mijiupro
- */
- @RestController
- @RequestMapping("/Captcha")
- @Tag(name = "验证码接口", description = "验证码接口相关操作")
- public class CaptchaController {
- private final StringRedisTemplate stringRedisTemplate;
-
- public CaptchaController(StringRedisTemplate stringRedisTemplate) {
- this.stringRedisTemplate = stringRedisTemplate;
- }
-
- @GetMapping("/graph-captcha")
- @Operation(summary = "获取验证码")
- public CaptchaVO getCaptcha(String captchaId) {
- // 创建一个图像验证码宽度为130,高度为48,包含4个字符,干扰线10个
- CircleCaptcha circleCaptcha = CaptchaUtil.createCircleCaptcha(130, 48, 4, 10);
- // 获取验证码的文本
- String captchaText = circleCaptcha.getCode();
- // 获取验证码图片的Base64编码
- String captchaImageBase64Data = circleCaptcha.getImageBase64Data();
- // 如果没有传入captchaId,则生成一个随机字符串作为captchaId
- captchaId = Optional.ofNullable(captchaId).orElseGet(() -> UUID.randomUUID().toString());
- // 保存验证码文本到Redis中,有效期30秒
- stringRedisTemplate.opsForValue().set("captcha:" + captchaId, captchaText, 30, TimeUnit.SECONDS);
-
- return CaptchaVO.builder()
- .captchaId(captchaId)
- .captchaImage(captchaImageBase64Data)
- .build();
- }
-
- }
这里使用Knife4jConfig(swigger3)测试,也可以用浏览器地址栏、Postman等测试

