java如何实现验证码
生成验证码图片
使用Java的BufferedImage类创建一个图片对象,设置宽度和高度。通过Graphics2D对象绘制背景色、干扰线和验证码文本。干扰线可以增加验证码的复杂度,防止机器识别。
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics2D g = image.createGraphics();
g.setColor(Color.WHITE);
g.fillRect(0, 0, width, height);
g.setColor(Color.BLACK);
g.drawString(code, 10, 25);
生成随机验证码文本
定义一个包含数字和字母的字符池,随机选取字符生成验证码字符串。可以设置验证码长度,通常4-6位字符足够。

String chars = "ABCDEFGHJKLMNPQRSTUVWXYZ23456789";
StringBuilder sb = new StringBuilder();
Random random = new Random();
for (int i = 0; i < length; i++) {
sb.append(chars.charAt(random.nextInt(chars.length())));
}
return sb.toString();
输出验证码图片
将生成的验证码图片写入响应输出流,设置响应头为图片类型。前端页面可以通过<img>标签的src属性指向生成验证码的接口地址。

response.setContentType("image/jpeg");
ImageIO.write(image, "jpeg", response.getOutputStream());
验证码校验逻辑
将生成的验证码字符串存储在Session中,用户提交表单时将输入的验证码与Session中的值比较。校验完成后立即清除Session中的验证码,防止重复使用。
String sessionCode = (String) request.getSession().getAttribute("captcha");
if (sessionCode != null && sessionCode.equalsIgnoreCase(inputCode)) {
// 验证通过
}
增加安全性措施
对验证码进行扭曲、噪点等处理,增加机器识别难度。限制验证码尝试次数,防止暴力破解。验证码应设置有效期,通常2-5分钟。
// 扭曲处理示例
AffineTransform affine = new AffineTransform();
affine.shear(0.1 * Math.random(), 0.1 * Math.random());
g.setTransform(affine);





