Java 生成图片验证码实战详解(附代码示例)
时间:2026-11-2 08:04 作者:emer 分类: 无
无论你是刚入门Java,还是想温故知新,关于生成图片验证码的这篇梳理都值得花几分钟读完。内容不长,但都是干货。
生成图片验证码到底解决了什么问题?
前两天帮同事排查一个 bug,最后定位到问题出在生成图片验证码上。类似的坑我见过不止一次,索性把生成图片验证码相关的经验整理成这篇文章,希望对你有帮助。
吃透生成图片验证码:核心概念梳理
- 生成图片验证码在循环中使用时要留意重复开销,能提到循环外的就提出来。
- 遇到生成图片验证码相关的问题,先看错误信息,大部分线索都藏在报错里。
- 上线前对生成图片验证码相关的功能做一轮完整测试,别只测正常流程。
- 生成图片验证码的命名和用法要保持团队内一致,否则后期维护成本会成倍增加。
- 使用生成图片验证码前先想清楚它解决的是什么问题,避免拿着锤子找钉子。
光说不练假把式,接下来用代码验证一下生成图片验证码的实际效果。
生成图片验证码实战代码
直接上代码,生成图片验证码:
public static String captcha(OutputStream out) throws Exception {
int w = 120, h = 40;
BufferedImage img = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
Graphics2D g = img.createGraphics();
g.setColor(Color.WHITE);
g.fillRect(0, 0, w, h);
String chars = "ABCDEFGHJKLMNPQRSTUVWXYZ23456789"; // 去掉易混淆字符
StringBuilder code = new StringBuilder();
Random r = new Random();
for (int i = 0; i < 4; i++) {
char c = chars.charAt(r.nextInt(chars.length()));
code.append(c);
g.setColor(new Color(r.nextInt(150), r.nextInt(150), r.nextInt(150)));
g.drawString(String.valueOf(c), 20 + i * 25, 28);
}
g.dispose();
ImageIO.write(img, "png", out);
return code.toString(); // 存入 session 用于校验
}
新手常犯的错误
- 注释要解释「为什么」而不是「是什么」,代码本身已经说明了是什么。
- 删除操作尽量用软删除,数据丢了神仙也救不回来。
- 配置文件不要用记事本编辑,编码问题会让你怀疑人生。
- 权限不足导致的报错往往信息不明确,排查时别忘了检查文件和目录权限。
总结
Java的世界很大,生成图片验证码只是其中一站。但这一站走稳了,后面的路会顺很多。
遇见问题加 QQ23979811 协助处理