当前位置:首页 > Java

java如何写验证码

2026-03-17 20:45:02Java

生成验证码图片

使用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));
}

生成随机验证码文本

定义验证码字符集,通常包含数字和大写字母。随机选取字符拼接成验证码字符串。

java如何写验证码

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中供验证使用。

java如何写验证码

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>

分享给朋友:

相关文章

php实现验证码

php实现验证码

PHP实现验证码的方法 使用GD库生成验证码 GD库是PHP中处理图像的扩展,可用于生成验证码图片。 <?php session_start(); $width = 120; $height…

java如何写接口

java如何写接口

定义接口 在Java中,使用interface关键字定义接口。接口可以包含抽象方法、默认方法、静态方法和常量(隐式为public static final)。 public interface…

php实现验证码的识别

php实现验证码的识别

验证码识别的基本方法 验证码识别通常分为手动实现和第三方工具两种方式。手动实现需要图像处理和机器学习知识,而第三方工具则更快捷。 使用Tesseract OCR识别验证码 Tesseract是一个开…

react如何写列表

react如何写列表

在React中渲染列表的方法 使用map方法遍历数组生成列表元素 React中通常通过JavaScript的map方法将数组数据转换为React元素数组。每个列表项需要包含唯一的key属性以提高渲染性…

react 如何写页面跳转

react 如何写页面跳转

页面跳转的实现方式 在React中实现页面跳转可以通过多种方式,以下是常见的几种方法: 使用React Router的<Link>组件 React Router是React生态中最常用的…

react native 如何写组件

react native 如何写组件

React Native 组件开发指南 React Native 组件开发主要分为两种类型:函数组件和类组件。以下分别介绍两种组件的写法及核心概念。 函数组件写法 函数组件是 React Nativ…