package com.moral.util; import com.google.code.kaptcha.impl.DefaultKaptcha; import com.moral.pojo.VerificationCode; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Component; import org.springframework.util.ObjectUtils; import sun.misc.BASE64Encoder; import javax.annotation.Resource; import javax.imageio.ImageIO; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.UUID; import java.util.concurrent.TimeUnit; /** * @ClassName KaptchaUtils * @Description 验证码工具类 * @Author 陈凯裕 * @Date 2021/3/16 15:36 * @Version TODO **/ @Component @Slf4j public class KaptchaUtils { private static DefaultKaptcha defaultKaptcha; private static RedisTemplate redisTemplate; //验证码有效期 单位:秒 private static final int validity_time = 60*60; @Autowired public void setRedisTemplate(RedisTemplate redisTemplate) { KaptchaUtils.redisTemplate = redisTemplate; } @Autowired @Qualifier(value = "kaptchaProducer") public void setDefaultKaptcha(DefaultKaptcha defaultKaptcha) { KaptchaUtils.defaultKaptcha = defaultKaptcha; } /** * @Description: 生成验证码 * @Param: [] * @return: java.lang.String * @Author: 陈凯裕 * @Date: 2021/3/16 */ public static VerificationCode createVerificationCode() throws IOException { VerificationCode verificationCode = new VerificationCode(); //生成验证码内容 String text = defaultKaptcha.createText(); //生成图片 BufferedImage image = defaultKaptcha.createImage(text); //获取图片的字节数组 ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); ImageIO.write(image,"jpg",outputStream); byte[] bytes = outputStream.toByteArray(); //将字节数组进行编码 BASE64Encoder encoder = new BASE64Encoder(); String encode = encoder.encode(bytes); //将验证码存入redis String key = UUID.randomUUID().toString(); redisTemplate.opsForValue().set(key,text); redisTemplate.expire(key,validity_time, TimeUnit.SECONDS); verificationCode.setKey(key); verificationCode.setEncode(encode); return verificationCode; } public static boolean verify(VerificationCode code) { String key = code.getKey(); String inputText = code.getInputText(); String validText = (String) redisTemplate.opsForValue().get(key); if(inputText.equals(validText)) return true; return false; } }