若依框架數字圖片驗證碼實現


 

 流程:獲取系統配置信息(是否開啟驗證碼開關),開啟則生成驗證碼圖片返回,保存驗證碼答案到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;

     

     

     

     


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM