首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >南南的文章-验证码还能这样生成?

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

作者头像
灬沙师弟
发布2023-03-07 09:35:10
发布2023-03-07 09:35:10
33100
举报
文章被收录于专栏:Java面试教程Java面试教程
运行总次数:0

前言:

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

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

同事A:???(黑脸)

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

正文:

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

代码语言:javascript
代码运行次数:0
运行
复制
@GetMapping("/captchaImg")
  public AjaxResult captchaImg(HttpServletResponse response){
      return captchaService.captchaImg(response);
  }

实现类:

代码语言:javascript
代码运行次数:0
运行
复制
@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,也就是过期时间,这样子我们的验证码就可以过期啦~这就是为什么我们在登录网站的时候,停留的时间太久,就会出现验证码过期的情况。

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

代码语言:javascript
代码运行次数:0
运行
复制
        //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直接将图片流给前端,只要和前端约定好即可。

总结:

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-12-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java面试教程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言:
  • 正文:
  • 总结:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档