目录
在JavaWeb项目中生成图形验证码是一种常见的实现方法,可以用来防止自动化的表单提交和保护用户登录安全。你可以使用Java中内置的图形处理库如 java.awt
和 javax.imageio
来生成图形验证码。
1. 创建验证码图片生成器类
首先,我们需要一个类来生成验证码图片。该类可以包含生成随机验证码字符串、绘制验证码图片等方法。
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.util.Random;
public class CaptchaGenerator {
private static final String CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
private static final int WIDTH = 150;
private static final int HEIGHT = 50;
public String generateCaptchaString(int length) {
Random r = new Random();
StringBuilder captchaStringBuilder = new StringBuilder();
for (int i = 0; i < length; i++) {
captchaStringBuilder.append(CHARACTERS.charAt(r.nextInt(CHARACTERS.length())));
}
return captchaStringBuilder.toString();
}
public BufferedImage generateCaptchaImage(String captchaString) {
BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
Graphics g = image.getGraphics();
// 设置背景颜色
g.setColor(Color.WHITE);
g.fillRect(0, 0, WIDTH, HEIGHT);
// 设置字体颜色和字体样式
g.setFont(new Font("Arial", Font.BOLD, 40));
g.setColor(Color.BLACK);
g.drawString(captchaString, 20, 40);
// 添加一些干扰线
Random r = new Random();
for (int i = 0; i < 10; i++) {
int x1 = r.nextInt(WIDTH);
int y1 = r.nextInt(HEIGHT);
int x2 = r.nextInt(WIDTH);
int y2 = r.nextInt(HEIGHT);
g.drawLine(x1, y1, x2, y2);
}
g.dispose();
return image;
}
}
2. 创建一个Servlet来生成和返回验证码图片
接下来,我们需要一个Servlet来处理生成验证码图片的请求。
import java.io.IOException;
import java.io.OutputStream;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
@WebServlet("/captcha")
public class CaptchaServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private CaptchaGenerator captchaGenerator = new CaptchaGenerator();
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String captchaString = captchaGenerator.generateCaptchaString(6);
request.getSession().setAttribute("captcha", captchaString);
BufferedImage captchaImage = captchaGenerator.generateCaptchaImage(captchaString);
response.setContentType("image/png");
try (OutputStream out = response.getOutputStream()) {
ImageIO.write(captchaImage, "png", out);
}
}
}
3. 请求验证码图片
在前端,可以通过 <img>
标签请求验证码图片。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Captcha</title>
</head>
<body>
<form action="yourFormAction" method="post">
<img src="captcha" alt="Captcha Image">
<input type="text" name="captcha" placeholder="Enter captcha">
<button type="submit">Submit</button>
</form>
</body>
</html>
4. 验证用户输入的验证码
在表单提交时,可以在服务器端对用户输入的验证码与服务器生成的验证码进行验证。
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String userCaptcha = request.getParameter("captcha");
String sessionCaptcha = (String) request.getSession().getAttribute("captcha");
if (sessionCaptcha != null && sessionCaptcha.equals(userCaptcha)) {
// 验证通过
response.getWriter().println("Captcha is correct.");
} else {
// 验证失败
response.getWriter().println("Captcha is incorrect.");
}
}
这样,我们就完成了JavaWeb项目中图形验证码的效果啦。