生成base64图片流验证码,并存入redis进行登录认证

1.controller中认证写法

2.工具类写法
/**

  • ValidateCodeGen

  • 功能:图片验证码工具类
    */
    @Component
    public class ValidateCodeGen {

    private String randString = “23456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghjkmnpqrstuvwxyz”;//随机产生数字与字母组合的字符串
    private int width = 100;// 图片宽
    private int height = 45;// 图片高
    private int lineSize = 30;// 干扰线数量
    private int stringNum = 4;// 随机产生字符数量

    private Random random = new Random();

    @Autowired
    private RedisDriver redis;

    /*

    • 获得字体
      */
      private Font getFont() {
      return new Font(“Fixedsys”, Font.CENTER_BASELINE, 35);
      }

    /*

    • 获得颜色
      */
      private Color getRandColor(int fc, int bc) {
      if (fc > 255)
      fc = 255;
      if (bc > 255)
      bc = 255;
      int r = fc + random.nextInt(bc – fc – 16);
      int g = fc + random.nextInt(bc – fc – 14);
      int b = fc + random.nextInt(bc – fc – 18);
      return new Color(r, g, b);
      }

    /**

    • 生成随机图片
    • @return
      */
      public String getRandcode(String str) {
      // BufferedImage类是具有缓冲区的Image类,Image类是用于描述图像信息的类
      BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR);
      Graphics g = image.getGraphics();// 产生Image对象的Graphics对象,改对象可以在图像上进行各种绘制操作
      g.fillRect(0, 0, width, height);
      g.setFont(new Font(“Times New Roman”, Font.ROMAN_BASELINE, 18));
      g.setColor(getRandColor(110, 133));
      // 绘制干扰线
      for (int i = 0; i <= lineSize; i++) {
      drowLine(g);
      }
      // 绘制随机字符
      String randomString = “”;
      for (int i = 1; i <= stringNum; i++) {
      randomString = drowString(g, randomString, i);
      }
      g.dispose();
      try {
      // 将内存中的图片通过流动形式输出到客户端
      //ImageIO.write(image, “JPEG”, response.getOutputStream());
      } catch (Exception e) {
      e.printStackTrace();
      }
      return randomString;

    }

    //public String getRandcode() {
    public Map<String,String> getRandcode(HttpServletRequest request,HttpServletResponse response) {
    //String VALIDATE_CODE_KEY = String.valueOf(IdWorker.getInstance().nextId());//生成验证码的key
    HashMap<String,String> map = new HashMap<String,String>();
    long startime = System.currentTimeMillis();
    byte[] bf = null;
    ByteArrayOutputStream out = null;
    String uuid = UUID.randomUUID().toString();
    //HttpSession session = request.getSession();
    // BufferedImage类是具有缓冲区的Image类,Image类是用于描述图像信息的类
    BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR);
    Graphics g = image.getGraphics();// 产生Image对象的Graphics对象,改对象可以在图像上进行各种绘制操作
    g.fillRect(0, 0, width, height);
    g.setFont(new Font(“Times New Roman”, Font.ROMAN_BASELINE, 18));
    g.setColor(getRandColor(110, 133));
    // 绘制干扰线
    for (int i = 0; i <= lineSize; i++) {
    drowLine(g);
    }
    // 绘制随机字符
    String randomString = “”;
    for (int i = 1; i <= stringNum; i++) {
    randomString = drowString(g, randomString, i);
    }
    //将验证码对应的key放入session并设置过期时间为3分钟
    //SecurityUtils.getSubject().getSession().setAttribute(uuid,randomString);
    //SecurityUtils.getSubject().getSession().setTimeout(3 * 60 * 1000);
    redis.setStringEx(uuid, 180, randomString);
    g.dispose();

     try {
         // 将内存中的图片通过流动形式输出到客户端
         out = new ByteArrayOutputStream();
         ImageIO.write(image, "JPEG", out);
         bf = out.toByteArray();
     } catch (Exception e) {
         e.printStackTrace();
     }finally {
         if(out != null){
             try {
                 out.close();
             } catch (IOException e) {
             }
         }
     }
     long end = System.currentTimeMillis();
     System.err.println((end - startime)/1000);
     map.put("validateCodeKey", uuid);
     map.put("validateCodeBase64", Base64Utils.encodeToString(bf));
     //return Base64Utils.encodeToString(bf);
     return map;
    

    }
    /*

    • 绘制字符串
      */
      private String drowString(Graphics g, String randomString, int i) {
      g.setFont(getFont());
      g.setColor(new Color(random.nextInt(101), random.nextInt(111), random
      .nextInt(121)));
      String rand = String.valueOf(getRandomString(random.nextInt(randString
      .length())));
      randomString += rand;
      g.translate(random.nextInt(3), random.nextInt(3));
      g.drawString(rand, 18 * i – 3, 32);
      return randomString;
      }

    /*

    • 绘制干扰线
      */
      private void drowLine(Graphics g) {
      int x = random.nextInt(width);
      int y = random.nextInt(height);
      int xl = random.nextInt(13);
      int yl = random.nextInt(15);
      g.drawLine(x, y, x + xl, y + yl);
      }

    /*

    • 获取随机的字符
      */
      public String getRandomString(int num) {
      return String.valueOf(randString.charAt(num));
      }

    public boolean check(String uuid, String code) {
    String oldCode = redis.getString(uuid);//(String)SecurityUtils.getSubject().getSession().getAttribute(uuid);//获取Redis中的验证码
    //不管校验成功失败,都清空验证码值
    redis.delKey(uuid);
    //validateCodeKey失效或者跟输入的不匹配,返回提示信息
    if(null == oldCode || StringUtils.isEmpty(oldCode) || !code.equalsIgnoreCase(oldCode)){
    return false;
    }

     return true;
    

    }

}

3.使用img标签和生成的base64流访问

4.Java后台服务自测:启用服务,调用生成验证码接口,然后网页页面输入data:image/gif;base64,(此处填图片转成base64编码后的编码) 网页中直接打开即可

本文地址:https://blog.csdn.net/qq_34279303/article/details/114271768

(0)
上一篇 2022年3月21日
下一篇 2022年3月21日

相关推荐