java如何写验证码
生成验证码图片
使用Java的BufferedImage类创建一个图片对象,设置宽度和高度。通过Graphics2D对象绘制背景色、干扰线和验证码文本。
int width = 100;
int height = 40;
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics2D g = image.createGraphics();
g.setColor(Color.WHITE);
g.fillRect(0, 0, width, height);
添加干扰元素
绘制随机干扰线和噪点,增加验证码的识别难度。使用Random类生成随机坐标和颜色。
Random random = new Random();
for (int i = 0; i < 5; i++) {
g.setColor(new Color(random.nextInt(256), random.nextInt(256), random.nextInt(256)));
g.drawLine(random.nextInt(width), random.nextInt(height), random.nextInt(width), random.nextInt(height));
}
生成随机验证码文本
定义验证码字符集,通常包含数字和大写字母。随机选取字符拼接成验证码字符串。

String chars = "ABCDEFGHJKLMNPQRSTUVWXYZ23456789";
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 4; i++) {
int index = random.nextInt(chars.length());
sb.append(chars.charAt(index));
}
String code = sb.toString();
绘制验证码文本
设置字体样式和颜色,将验证码文本绘制到图片上。可以添加旋转和扭曲效果增强安全性。
g.setFont(new Font("Arial", Font.BOLD, 20));
for (int i = 0; i < code.length(); i++) {
g.setColor(new Color(random.nextInt(256), random.nextInt(256), random.nextInt(256)));
g.drawString(String.valueOf(code.charAt(i)), 20 * i + 10, 25);
}
输出验证码图片
将生成的验证码图片写入响应流,供前端显示。同时需要将验证码文本存储在Session中供验证使用。

response.setContentType("image/jpeg");
ImageIO.write(image, "jpeg", response.getOutputStream());
request.getSession().setAttribute("captcha", code);
验证用户输入
在服务端比较用户输入的验证码和Session中存储的值,注意要忽略大小写并立即清除Session中的验证码。
String userInput = request.getParameter("captcha");
String sessionCode = (String) request.getSession().getAttribute("captcha");
request.getSession().removeAttribute("captcha");
boolean isValid = userInput != null && userInput.equalsIgnoreCase(sessionCode);
使用第三方库简化流程
考虑使用Google的Kaptcha库,通过配置简化验证码生成过程。在web.xml中配置Kaptcha servlet,前端直接调用即可。
<servlet>
<servlet-name>Kaptcha</servlet-name>
<servlet-class>com.google.code.kaptcha.servlet.KaptchaServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Kaptcha</servlet-name>
<url-pattern>/kaptcha.jpg</url-pattern>
</servlet-mapping>






