开发中遇到的问题&解决方案(九)

194 阅读2分钟

「这是我参与2022首次更文挑战的第21天,活动详情查看:2022首次更文挑战

前言

在我们的系统里验证码是必不可少的,比如注册登录时,忘记密码时,设置支付密码时或者支付下单时,那验证码的作用在哪里呢?其实就一条为了防止来着黑客和机器人恶意的攻击,那么下面我们来看看hutool里验证码工具类。 一.验证码组成 一般的验证码由两部分组成,一是背景的干扰线,二是用于验证的验证码,验证码可以是数字+英文(大小写),也可以是纯中文,也可以是12306网站那种找出同类似的图片,另外一种就是最近几年出来滑块验证,可以看看下面的思维导图。

image.png 二.生成验证码的主要方法解读 1.创建验证码图像,这里是以数字和字母为基础生成验证码,当然也可以自定义生成

public Image createImage(String code) {
   // 图像buffer
   final BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
   final Graphics2D g = GraphicsUtil.createGraphics(image, ObjectUtil.defaultIfNull(this.background, Color.WHITE));
   // 干扰线
   drawInterfere(g);
   // 字符串
   drawString(g, code);
   return image;
}

2.随机干扰线的绘制

private void drawInterfere(Graphics2D g) {
   final ThreadLocalRandom random = RandomUtil.getRandom();
   // 随机干扰线
   for (int i = 0; i < this.interfereCount; i++) {
      int xs = random.nextInt(width);
      int ys = random.nextInt(height);
      int xe = xs + random.nextInt(width / 8);
      int ye = ys + random.nextInt(height / 8);
      //颜色随机
      g.setColor(ImgUtil.randomColor(random));
      //根据坐标绘制
      g.drawLine(xs, ys, xe, ye);
   }
}

3.验证验证码是否正确,这个是很普通的校验,如果需要更加严谨的则需要加一下时间一起匹配校验

public boolean verify(String code, String userInputCode) {
   if (StrUtil.isNotBlank(userInputCode)) {
   //验证码验证一般都是忽略大小写的
   //另外一般在开发中对于英文如果不是强校验大小写都忽略一下大小写
      return StrUtil.equalsIgnoreCase(code, userInputCode);
   }
   return false;
}

小结

验证码只是系统里的安全防范的第一道墙,日常开发中还有比如token,权限等校验,如果是社区类的网站还有防刷等功能,一定时刻谨记安全是最最最重要的的。