700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > Kaptcha 图片验证码使用

Kaptcha 图片验证码使用

时间:2020-07-20 16:22:44

相关推荐

Kaptcha 图片验证码使用

前言

图验设计初衷就是为了提高系统的安全性,防止有些人利用自动化工具恶意攻击网站,比如批量注册、撞库等,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);}}}

如上案例生成的为不区分大小写的四位验证码~如下所示

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。