zl程序教程

您现在的位置是:首页 >  其它

当前栏目

南南的文章-验证码还能这样生成?

生成 文章 验证码 这样
2023-06-13 09:15:32 时间

前言:

同事A:咱这个管理后台页面的验证码咋搞啊?小面

小面:这你都不会?还来上什么班?(狗头)

同事A:???(黑脸)

今天小面给大家介绍验证码的前后逻辑与生成。

正文:

我们先写一个验证码的接口

@GetMapping("/captchaImg")
  public AjaxResult captchaImg(HttpServletResponse response){
      return captchaService.captchaImg(response);
  }

实现类:

@Override
  public AjaxResult captchaImg(HttpServletResponse response) {
      LineCaptcha lineCaptcha = CaptchaUtil.createLineCaptcha(200, 100);
      try {
          lineCaptcha.write(response.getOutputStream());
      } catch (IOException e) {
          throw new RuntimeException(e);
      }
      String simpleUUID = IdUtil.simpleUUID();
      redisCache.setCacheObject(CacheConstants.CAPTCHA_CODE_KEY+simpleUUID , lineCaptcha.getCode(), Constants.CAPTCHA_EXPIRATION, TimeUnit.MINUTES);
      AjaxResult ajaxResult = AjaxResult.success();
      ajaxResult.put("uuid",simpleUUID);
      ajaxResult.put("base64", lineCaptcha.getImageBase64());
      return ajaxResult;
  }

这边我们使用的是HuTool的工具类,CaptchaUtil.createLineCaptcha(200, 100),去生成的验证码图片,参数是宽高的意思。

我们想要的验证码类型也是很多的,大小也可以去设置。

比如说我们常见的线段干扰,圆圈干扰,我们也可以自定义验证码(比如算数、纯字母的验证码、纯数字的验证码)。

生成验证码是很简单的,不过大家看看代码,我们在生成验证码之后,还去做了两步。

第一步去生成了一个uuid,第二步是把uuid和一个我们自己定义的一个字符串做成key,验证码作为value去存入缓存。然后封装进我们写的AjaxResult返回给前端。

这样设计是为什么呢?首先我们设计一个uuid就是为了防止key重复,以防验证码被覆盖。其次存入redis是为了,设置一个expire,也就是过期时间,这样子我们的验证码就可以过期啦~这就是为什么我们在登录网站的时候,停留的时间太久,就会出现验证码过期的情况。

同时我们在设计登录接口的时候,其中有一部就是要去缓存中拿到这个验证码,再去校验验证码。

        //code是传进来的参数,也就是用户输入的验证码
        String cacheObject = redisCache.getCacheObject(CacheConstants.CAPTCHA_CODE_KEY + uuid);
        if (!code.equals(cacheObject)){
            throw new BaseException("login","10005",args,"验证码错误");
        }

这也是为什么我们要把uuid也要传给前端,要不然我们就获取不到key啦。这里我们也可以做一个判断,cacheObject如果为空,那就返回一个验证码过期的提示给前端。

最后,我们可以把图片转化成base64给前端就可以啦,同时我们也可以使用outputStream直接将图片流给前端,只要和前端约定好即可。

总结:

这样简单的验证码前后的一个逻辑就完成了。如果你想自己去画一个验证码出来,也可以去研究一下里面的奥秘~