绘制验证码



验证码功能只需复制粘贴即可,做个记录方便回看


1. 绘制验证码

public class VerifyCode {

    private int width = 100;
    private int height = 50;
    private int CODE_COUNT = 4;
    private int LINE_COUNT = 5;
    private String[] FONTNAMES = {"宋体", "楷体", "隶书", "微软雅黑"};
    private String CODES = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";

    private Random random = new Random();
    private String code;

    // 随机RGB,RGB不易过高
    private Color randomColor() {
        int red = random.nextInt(150);
        int green = random.nextInt(150);
        int blue = random.nextInt(150);
        return new Color(red, green, blue);
    }

    // 随机字体
    private Font randomFont() {
        String name = FONTNAMES[random.nextInt(FONTNAMES.length)];
        int style = random.nextInt(4);
        int size = random.nextInt(5) + 25;
        return new Font(name, style, size);
    }

    // 随机字符
    private char randomChar() {
        return CODES.charAt(random.nextInt(CODES.length()));
    }

    // 返回绘制的验证码图片
    public BufferedImage getImage() {
        // 绘制背景
        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        Graphics2D g2 = (Graphics2D) image.getGraphics();
        g2.setColor(new Color(250, 250, 250));
        g2.fillRect(0, 0, width, height);

        // 绘制验证码
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < CODE_COUNT; i++) {
            String s = randomChar() + "";
            sb.append(s);
            g2.setColor(randomColor());
            g2.setFont(randomFont());
            float x = i * width / CODE_COUNT;
            float y = height / 2 + random.nextInt(height / 4);
            g2.drawString(s, x, y);
        }
        
        // 绘制干扰线
        for (int i = 0; i < LINE_COUNT; i++) {
            int x1 = random.nextInt(width);
            int y1 = random.nextInt(height);
            int x2 = random.nextInt(width);
            int y2 = random.nextInt(height);
            g2.setColor(randomColor());
            g2.setStroke(new BasicStroke(1));
            g2.drawLine(x1, y1, x2, y2);
        }
        this.code = sb.toString();
        return image;
    }

    // 获取验证码
    public String getCode() {
        return code;
    }

    // 输出图片
    public static void output(BufferedImage image, OutputStream out) throws IOException {
        ImageIO.write(image, "JPEG", out);
    }
}


2. Controller层

@RestController
public class VerifyCodeController {
    @GetMapping("/verifyCode")
    public void verifyCode(HttpServletRequest req, HttpServletResponse res) throws IOException {
        VerifyCode vc = new VerifyCode();
        BufferedImage image = vc.getImage();
        String code = vc.getCode();
        HttpSession session = req.getSession();
        session.setAttribute("verifyCode", code);
        VerifyCode.output(image, res.getOutputStream());
    }
}


3. 页面

<img src="/verifyCode" alt="看不清楚,点击换一张">


4. 测试


原文地址:https://www.cnblogs.com/Howlet/p/12753955.html