Java后端代码实现图形验证码
时间: 2023-11-21 07:06:24 浏览: 38
下面是一个简单的 Java 后端代码实现图形验证码的示例:
```java
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;
@WebServlet("/captcha")
public class CaptchaServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
int width = 100; // 验证码图片宽度
int height = 40; // 验证码图片高度
int length = 4; // 验证码位数
String chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; // 随机字符集合
// 创建一个随机数生成器
Random random = new Random();
// 创建一个 BufferedImage 对象,用于绘制验证码图片
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
// 获取一个 Graphics2D 对象,用于绘制图形
Graphics2D g2d = image.createGraphics();
// 设置背景色
g2d.setColor(Color.WHITE);
g2d.fillRect(0, 0, width, height);
// 绘制边框
g2d.setColor(Color.BLACK);
g2d.drawRect(0, 0, width - 1, height - 1);
// 绘制随机字符
g2d.setFont(new Font("Arial", Font.BOLD, 20));
StringBuilder sb = new StringBuilder();
for (int i = 0; i < length; i++) {
char c = chars.charAt(random.nextInt(chars.length()));
sb.append(c);
g2d.setColor(new Color(random.nextInt(256), random.nextInt(256), random.nextInt(256)));
g2d.drawString(String.valueOf(c), 20 * i + 10, 25);
}
// 绘制干扰线
for (int i = 0; i < 5; i++) {
g2d.setColor(new Color(random.nextInt(256), random.nextInt(256), random.nextInt(256)));
g2d.drawLine(random.nextInt(width), random.nextInt(height), random.nextInt(width), random.nextInt(height));
}
// 将生成的验证码字符串存入 Session 中,以便后续验证
req.getSession().setAttribute("captcha", sb.toString());
// 关闭 Graphics2D 对象
g2d.dispose();
// 向客户端输出验证码图片
resp.setContentType("image/png");
ServletOutputStream out = resp.getOutputStream();
ImageIO.write(image, "png", out);
out.close();
}
}
```
在上述代码中,我们通过 `Random` 类生成随机字符和干扰线,然后使用 `Graphics2D` 类将这些元素绘制到一个 `BufferedImage` 对象中。最后,我们将生成的验证码字符串存入 Session 中,并将验证码图片作为 PNG 格式输出给客户端。