前言
图验设计初衷就是为了提高系统的安全性,防止有些人利用自动化工具恶意攻击网站,比如批量注册、撞库等,Kaptcha 框架就是现场一个图片验证码工具,简单好上手,我们大可直接使用
使用
1. 添加依赖
<dependency><groupId>com.github.penggle</groupId><artifactId>kaptcha</artifactId><version>2.3.2</version></dependency>
2. 编写配置类
@Configurationpublic class KaptchaConfig {@BeanProducer producer() {Properties properties = new Properties();// 设置图片边框properties.setProperty("kaptcha.border", "no");// 设置图片边框为蓝色// properties.setProperty("kaptcha.border.color", "white");// 背景颜色渐变开始properties.put("kaptcha.background.clear.from", "white");// 背景颜色渐变结束properties.put("kaptcha.background.clear.to", "white");// 字体颜色properties.put("kaptcha.textproducer.font.color", "5,115,217");// 文字间隔properties.put("kaptcha.textproducer.char.space", "10");// 干扰线颜色配置properties.put("kaptcha.noise.color", "5,115,217");// 如果需要去掉干扰线// properties.put("kaptcha.noise.impl", "com.google.code.kaptcha.impl.NoNoise");// 字体properties.put("kaptcha.textproducer.font.names", "宋体,楷体,微软雅黑");// 图片宽度properties.setProperty("kaptcha.image.width", "200");// 图片高度properties.setProperty("kaptcha.image.height", "50");// 从哪些字符中产生properties.setProperty("kaptcha.textproducer.char.string", "0123456789abcdefghijklmnopqrsduvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ");// 字符个数properties.setProperty("kaptcha.textproducer.char.length", "4");DefaultKaptcha defaultKaptcha = new DefaultKaptcha();defaultKaptcha.setConfig(new Config(properties));return defaultKaptcha;}}
3. 验证码生成与校验
@Slf4j@Component@AllArgsConstructorpublic class PictureVerificationCodeUtils {private Producer producer;private StringRedisTemplate redisTemplate;/*** 生成图片验证码*/public Map<String, String> create() {Map<String, String> resultMap = new HashMap<>();try {String verifyCode = producer.createText();BufferedImage bufferedImage = producer.createImage(verifyCode);// 将图片转换陈字符串给前端ByteArrayOutputStream stream = new ByteArrayOutputStream();ImageIO.write(bufferedImage, "jpg", stream);String base64 = Base64.getEncoder().encodeToString(stream.toByteArray());stream.flush();stream.close();// 存到redis中String lowerCase = verifyCode.toLowerCase();String key = UUIDUtils.uuid();redisTemplate.opsForValue().set(key, lowerCase, 5, TimeUnit.MINUTES);resultMap.put("verifyCodeKey", key);resultMap.put("verifyCode", "data:image/jpg;base64," + base64);} catch (IOException e) {log.error("生成图片验证码异常: {}", e.getMessage());}return resultMap;}/*** 校验图片验证码* @param verifyCode 图片验证码code* @param verifyCodeKey 图片验证码key*/public void verify(String verifyCode, String verifyCodeKey) {String lowerCase = verifyCode.toLowerCase();String code = redisTemplate.opsForValue().get(verifyCodeKey);if (StringUtils.isEmpty(code)) {throw new AppApiServerException(PICTURE_VERIFICATION_CODE_OVERDUE);}if (!StringUtils.equals(lowerCase, code)) {throw new AppApiServerException(PICTURE_VERIFICATION_CODE_ERROR);}}}
如上案例生成的为不区分大小写的四位验证码~如下所示