当前位置:首页 > 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>

分享给朋友:

相关文章

react如何写跳转

react如何写跳转

使用 React Router 进行页面跳转 React 应用中通常使用 react-router-dom 库实现页面跳转。以下是几种常见的跳转方式: 安装依赖包 npm install reac…

如何写react项目

如何写react项目

创建React项目 使用Create React App(CRA)快速初始化项目,这是官方推荐的脚手架工具。运行以下命令生成项目结构: npx create-react-app my-app cd…

react中token如何写

react中token如何写

在React中处理Token的方法 使用localStorage或sessionStorage存储Token 将Token存储在浏览器的localStorage或sessionStorage中,便于跨…

react中如何写proxy

react中如何写proxy

在React中配置代理(Proxy)通常用于解决开发环境下的跨域问题,或转发API请求到后端服务器。以下是几种常见实现方式: 使用package.json配置 在React项目的package.js…

react中如何写重置按钮

react中如何写重置按钮

重置按钮的实现方法 在React中,重置按钮通常用于将表单或组件的状态恢复到初始值。以下是几种常见的实现方式: 使用表单的reset方法 对于原生HTML表单元素,可以直接调用reset()方法:…

如何写react项目多个页面

如何写react项目多个页面

创建多页面React项目的方法 使用React Router管理多页面是常见方案。React Router是React官方推荐的库,用于处理单页应用(SPA)中的路由和页面导航。 安装React R…