采用servlet生成4个字符的彩色验证码,并把他运用在用户登录页面上
时间: 2024-03-05 07:55:18 浏览: 14
以下是用 Servlet 实现生成 4 个字符的彩色验证码,并将其应用于用户登录页面的示例代码:
```java
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.awt.*;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;
public class CaptchaServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private static final String CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
private static final int WIDTH = 80;
private static final int HEIGHT = 30;
private static final int FONT_SIZE = 20;
private static final int CHAR_COUNT = 4;
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 设置响应内容类型为图片
response.setContentType("image/jpeg");
// 创建 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);
// 设置画笔颜色
Random random = new Random();
g2d.setColor(new Color(random.nextInt(256), random.nextInt(256), random.nextInt(256)));
// 设置字体
Font font = new Font("Arial", Font.BOLD, FONT_SIZE);
g2d.setFont(font);
// 生成随机字符串
StringBuilder sb = new StringBuilder();
for (int i = 0; i < CHAR_COUNT; i++) {
char c = CHARACTERS.charAt(random.nextInt(CHARACTERS.length()));
sb.append(c);
}
String captcha = sb.toString();
// 将验证码字符串绘制到图片上
int x = 10;
int y = 20;
for (char c : captcha.toCharArray()) {
AffineTransform transform = new AffineTransform();
transform.setToTranslation(x, y);
transform.rotate(Math.toRadians(random.nextInt(30) - 15), 0, 0);
g2d.setTransform(transform);
g2d.drawString(String.valueOf(c), 0, 0);
x += FONT_SIZE + 5;
}
// 添加干扰线条
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));
}
// 释放 Graphics2D 对象
g2d.dispose();
// 将验证码字符串保存到 Session 中
request.getSession().setAttribute("captcha", captcha);
// 将图片响应给客户端
ServletOutputStream outputStream = response.getOutputStream();
ImageIO.write(image, "jpeg", outputStream);
outputStream.close();
}
}
```
这段代码会生成一个 4 个字符的彩色验证码,并将其绘制到一个 BufferedImage 对象中。然后,它会将验证码字符串保存到 Session 中,以便在用户提交登录表单时进行验证。在应用该验证码的登录页面中,可以使用以下代码来显示验证码图片和输入框,并且在提交表单时将用户输入的验证码字符串与 Session 中保存的验证码字符串进行比较:
```html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>登录</title>
</head>
<body>
<h1>登录</h1>
<form action="login" method="post">
<label for="username">用户名:</label>
<input type="text" id="username" name="username"><br>
<label for="password">密码:</label>
<input type="password" id="password" name="password"><br>
<label for="captcha">验证码:</label>
<input type="text" id="captcha" name="captcha">
<img src="captcha" alt="验证码"><br>
<input type="submit" value="登录">
</form>
</body>
</html>
```
这段代码会在表单中显示一个验证码输入框和一个验证码图片,并且在提交表单时会将验证码字符串一起提交。在后台代码中,可以使用以下代码来比较用户输入的验证码字符串和 Session 中保存的验证码字符串:
```java
String captcha = (String) request.getSession().getAttribute("captcha");
String userCaptcha = request.getParameter("captcha");
if (userCaptcha == null || !userCaptcha.equalsIgnoreCase(captcha)) {
// 验证码错误
response.sendRedirect("login.jsp?error=captcha");
return;
}
```
这段代码会从 Session 中获取保存的验证码字符串和用户提交的验证码字符串进行比较,并且如果不匹配,则重定向到登录页面并且传递一个名为 error 的参数,用于在页面上显示错误消息。