导入依赖
<dependencies>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.25</version>
</dependency>
</dependencies>
代码
@Service
public class ValidateCodeServiceImpl implements ValidateCodeService {
@Autowired
private RedisTemplate<String , String> redisTemplate ;
@Override
public ValidateCodeVo generateValidateCode() {
// 使用hutool工具包中的工具类生成图片验证码
//参数:宽 高 验证码位数 干扰线数量
CircleCaptcha circleCaptcha = CaptchaUtil.createCircleCaptcha(150, 48, 4, 2);
String codeValue = circleCaptcha.getCode();
String imageBase64 = circleCaptcha.getImageBase64();
// 生成uuid作为图片验证码的key
String codeKey = UUID.randomUUID().toString().replace("-", "");
// 将验证码存储到Redis中
redisTemplate.opsForValue().set("user:login:validatecode:" + codeKey , codeValue , 5 , TimeUnit.MINUTES);
// 构建响应结果数据
ValidateCodeVo validateCodeVo = new ValidateCodeVo() ;
validateCodeVo.setCodeKey(codeKey);
validateCodeVo.setCodeValue("data:image/png;base64," + imageBase64);
// 返回数据
return validateCodeVo;
}
}
登录判断验证码
//获取输入的验证码和redis中的key
String codeKey = loginDto.getCodeKey();
String captcha = loginDto.getCaptcha();
//根据获取redis里面的key,查询redis里面存储验证码
String redisCode = redisTemplate.opsForValue().get("user:login:validatecode:" + codeKey);
//比较输入的验证码和redis存储验证码是否一致
//如果不一样提示,用户校验失败
if (StrUtil.isEmpty(redisCode) || !StrUtil.equalsIgnoreCase(redisCode, captcha)) {
throw new GuiguException(ResultCodeEnum.VALIDATECODE_ERROR);
}
//如果一致,删除redis中的验证码数据
redisTemplate.delete("user:login:validatecode:" + codeKey);