若依框架数字图片验证码实现

 

 流程:获取系统配置信息(是否开启验证码开关),开启则生成验证码图片返回,保存验证码答案到redis,返回redis中key值的uuid以供后续验证码验证。

 

  •  进入首页时向后台发送验证码获取请求。
  • 后台执行getimage方法
  • @GetMapping("/captchaImage")
    public AjaxResult getCode(HttpServletResponse response) throws IOException
    {
    AjaxResult ajax = AjaxResult.success();
    boolean captchaOnOff = configService.selectCaptchaOnOff()
  • 后台执行方法获取系统配置信息获取是否开启了验证码开关,后端数据库中captchaOnOff默认值为true代表验证码开关默认开启。

  • @Override
    public boolean selectCaptchaOnOff()
    {
    String captchaOnOff = selectConfigByKey("sys.account.captchaOnOff");
    if (StringUtils.isEmpty(captchaOnOff))
    {
    return true;
    }
    return Convert.toBool(captchaOnOff);
    }
  • 先去缓存中获取配置信息,缓存中有直接返回,如果没有则新建一个系统配置实体类,其中验证码开关默认值为true,即开启验证码开关。
  • @Override
    public String selectConfigByKey(String configKey)
    {
    String configValue = Convert.toStr(redisCache.getCacheObject(getCacheKey(configKey)));
    if (StringUtils.isNotEmpty(configValue))
    {
    return configValue;
    }
    SysConfig config = new SysConfig();
    config.setConfigKey(configKey);
    SysConfig retConfig = configMapper.selectConfig(config);
    if (StringUtils.isNotNull(retConfig))
    {
    redisCache.setCacheObject(getCacheKey(configKey), retConfig.getConfigValue());
    return retConfig.getConfigValue();
    }
    return StringUtils.EMPTY;
    }
  • 后台获取到验证码开关后 CAPTCHA_CODE_KEY加随机uuid组成redis中验证码答案的key值,若依系统配置中验证码类型captchaType为math即生成数学类型的验证码,
    •   使用producer生成器生成验证码,需要的依赖:
      <dependency>
       
      <groupId>com.github.penggle</groupId>
       
      <artifactId>kaptcha</artifactId>
       
      <version>2.3.2</version>
       
      </dependency>

       

      使用Producer类的createText()生成验证码,格式为1+2=@3,通过@截取字符串,前面的部分调用Producer.createImage()生成图片验证码,后面的code作为答案存入redis中。图片使用输出流返回前端,将uuid返回。前端认证时,将uuid传回前端供用户认证时携带进行验证码认证。
  • // 保存验证码信息
    String uuid = IdUtils.simpleUUID();
    String verifyKey = Constants.CAPTCHA_CODE_KEY + uuid;

    String capStr = null, code = null;
    BufferedImage image = null;

    // 生成验证码
    if ("math".equals(captchaType))
    {
    String capText = captchaProducerMath.createText();
    capStr = capText.substring(0, capText.lastIndexOf("@"));
    code = capText.substring(capText.lastIndexOf("@") + 1);
    image = captchaProducerMath.createImage(capStr);
    }
    else if ("char".equals(captchaType))
    {
    capStr = code = captchaProducer.createText();
    image = captchaProducer.createImage(capStr);
    }

    redisCache.setCacheObject(verifyKey, code, Constants.CAPTCHA_EXPIRATION, TimeUnit.MINUTES);
    // 转换流信息写出
    FastByteArrayOutputStream os = new FastByteArrayOutputStream();
    try
    {
    ImageIO.write(image, "jpg", os);
    }
    catch (IOException e)
    {
    return AjaxResult.error(e.getMessage());
    }

    ajax.put("uuid", uuid);
    ajax.put("img", Base64.encode(os.toByteArray()));
    return ajax;

     

     

     

     

posted @ 2021-11-02 11:29  迷茫的bug  阅读(2803)  评论(0编辑  收藏  举报
1