用Java实现验证码

时间:2021-07-14
本文章向大家介绍用Java实现验证码,主要包括用Java实现验证码使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

1. 写一个生成随机验证码的工具类

public class CodeImageUtil {
    private static final char[] chars = {
            '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
            'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'm', 'n',
            'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
            'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'N',
            'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'
    };
    // 字符数量
    private static final int SIZE = 4;
    // 干扰线数量
    private static final int LINES = 5;
    // 宽度
    private static final int WIDTH = 100;
    // 高度
    private static final int HEIGHT = 40;
    // 字体大小
    private static final int FONT_SIZE = 30;

    public static Object[] createImage(){
        StringBuffer sb = new StringBuffer();
        //创建空白图片
        BufferedImage image = new BufferedImage(WIDTH,HEIGHT,BufferedImage.TYPE_INT_RGB);
        //获取图片画笔
        Graphics graphics = image.getGraphics();
        //设置画笔颜色
        graphics.setColor(new Color(0xEDEDED));
        //绘制矩形背景
        graphics.fillRect(0,0,WIDTH,HEIGHT);
        //画随机字符
        Random random = new Random();
        for (int i=0;i<SIZE;i++){
            //获取随机字符索引
            int j = random.nextInt(chars.length);
            //设置随机颜色
            graphics.setColor(getRandonColor());
            //设置字体大小
            graphics.setFont(new Font(null,Font.BOLD+Font.ITALIC,FONT_SIZE));
            //画字符
            graphics.drawString(chars[j] + "",i * (WIDTH)/SIZE + 1,HEIGHT*2/3);
            //记录字符
            sb.append(chars[j]);
        }
        //画干扰线
        for (int i = 0;i<LINES;i++){
            //设置随机颜色
            graphics.setColor(getRandonColor());
            //随机画线
            graphics.drawLine(random.nextInt(WIDTH),random.nextInt(HEIGHT),random.nextInt(WIDTH),random.nextInt(HEIGHT));
        }
        //返回验证码和图片
        return new Object[]{sb.toString(),image};
    }

    /**
     * 随机取色
     */
    private static Color getRandonColor() {
        Random random = new Random();
        Color color = new Color(random.nextInt(256),random.nextInt(256),random.nextInt(256));
        return color;
    }
}

2. 使用工具类,将图片和随机的验证码返回

public void getCode(HttpServletResponse response, HttpSession session) throws IOException {
  Object[] objs = CodeImageUtil.createImage();
        String code = (String) objs[0];
        BufferedImage image = (BufferedImage) objs[1];

        OutputStream os = response.getOutputStream();
        ImageIO.write(image,"png",os);
        System.out.println(code);
        session.setAttribute("Code",code);
}

原文地址:https://www.cnblogs.com/zheng-yi/p/15010115.html