Java使用imageio、awt生成图片验证码

1、生成验证码工具类

public class CheckCodeTool {
    private Integer width = 80;
    private Integer height = 38;
    
      public String getCheckCode(BaseForm baseForm) {
            /*
             * 绘图
             */
            // step1,创建一个内存映像对象(画板)
            BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
            // step2,获得画笔
            Graphics g = image.getGraphics();
            // step3,给笔上色
            //Random r = new Random();
            SecureRandom r = new SecureRandom();
            // g.setColor(new Color(r.nextInt(255), r.nextInt(255),r.nextInt(255)));
            // step4,给画板设置背景颜色
            g.fillRect(0, 0, width, height);
            // step5,绘制一个随机的字符串
            String number = getNumber();
            g.setColor(new Color(0, 0, 0));

            //存储到redis(用于登录校验)
            if (baseForm != null && StringUtils.isNotEmpty(baseForm.getSessionId())) {
                String redisCheckCodeId = "CheckCodeId";
                try {
                    if (RedisUtil.getInstance().isExists(redisCheckCodeId)) {
                        RedisUtil.getInstance().remove(redisCheckCodeId);
                    }
                    RedisUtil.getInstance().setStringWithSeconds(redisCheckCodeId,number,60);//1分钟时效
                } catch (Exception e) {
                    System.out.println("getCheckCode:error:" + e.toString());
                }
            }
            // new Font(字体,风格,大小)
            g.setFont(new Font(null, Font.ITALIC, 20));
            g.drawString(number, 5, 25);
            // step6,加一些干扰线
            for (int i = 0; i < 8; i++) {
                g.setColor(new Color(r.nextInt(255), r.nextInt(255), r.nextInt(255)));
                g.drawLine(r.nextInt(width), r.nextInt(height), r.nextInt(width), r.nextInt(height));
            }
            /*
             * 压缩图片并输出到客户端(浏览器)
             */
            ByteArrayOutputStream out = new ByteArrayOutputStream();
            String base64String = "";
            try {
                ImageIO.write(image, "jpeg", out);
                base64String = Base64Utils.encode(out.toByteArray());
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if (out != null) {
                    try {
                        out.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
            
            return base64String;
        }

        // 生成随机数作为验证码
        private String getNumber() {
            String number = "";
            String pool = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
            SecureRandom r = new SecureRandom();
            for (int i = 0; i < 4; i++) {
                number += pool.charAt(r.nextInt(pool.length()));
            }
            return number;
        }
}

2、测试验证类

public class CheckCodeTest {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        CheckCodeTool checkCodeTool = new CheckCodeTool();
        String checkCode = checkCodeTool.getCheckCode(new BaseForm());
        System.out.println(checkCode);
    }

}

 输出:

/9j/4AAQSkZJRgABAgAAAQABAAD/2wBDAAgGB ......

将base64String字符串传递给前端,即可显示图片验证码。

posted @ 2018-07-03 22:16  马非白即黑  阅读(1834)  评论(0编辑  收藏  举报