javaweb 设计一个验证码
时间: 2023-11-11 16:06:51 浏览: 105
好的,下面是一个简单的使用 Java Web 技术实现验证码的示例代码:
首先,我们需要编写一个 Servlet,用于生成验证码:
```java
package com.example;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class CaptchaServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
// 验证码图片的宽度和高度
private static final int CAPTCHA_WIDTH = 120;
private static final int CAPTCHA_HEIGHT = 40;
// 验证码字符集合
private static final char[] CHARACTERS = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray();
// 随机数生成器
private static final Random RANDOM = new Random();
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 创建验证码图片
BufferedImage captchaImage = new BufferedImage(CAPTCHA_WIDTH, CAPTCHA_HEIGHT, BufferedImage.TYPE_INT_RGB);
Graphics g = captchaImage.getGraphics();
// 绘制背景
g.setColor(Color.WHITE);
g.fillRect(0, 0, CAPTCHA_WIDTH, CAPTCHA_HEIGHT);
// 生成随机验证码
StringBuilder captchaBuilder = new StringBuilder();
for (int i = 0; i < 4; i++) {
captchaBuilder.append(CHARACTERS[RANDOM.nextInt(CHARACTERS.length)]);
}
String captcha = captchaBuilder.toString();
// 将验证码保存到 Session 中
HttpSession session = request.getSession();
session.setAttribute("captcha", captcha);
// 绘制验证码
g.setColor(Color.BLACK);
g.setFont(new Font("Arial", Font.BOLD, 24));
for (int i = 0; i < captcha.length(); i++) {
g.drawString(String.valueOf(captcha.charAt(i)), i * 25 + 10, 30);
}
// 绘制干扰线
for (int i = 0; i < 6; i++) {
g.setColor(new Color(RANDOM.nextInt(256), RANDOM.nextInt(256), RANDOM.nextInt(256)));
g.drawLine(RANDOM.nextInt(CAPTCHA_WIDTH), RANDOM.nextInt(CAPTCHA_HEIGHT), RANDOM.nextInt(CAPTCHA_WIDTH), RANDOM.nextInt(CAPTCHA_HEIGHT));
}
// 输出验证码图片
response.setContentType("image/jpeg");
ImageIO.write(captchaImage, "jpeg", response.getOutputStream());
}
}
```
在 doGet 方法中,我们首先创建了一个 BufferedImage 对象,用于绘制验证码图片。然后,我们使用 Graphics 对象绘制了一个白色背景,并生成了一个随机验证码。接着,我们将验证码保存到 Session 中,以便后续验证。然后,我们使用 Graphics 对象绘制了验证码和干扰线,并最终将验证码图片输出到客户端。
接下来,在 JSP 页面中,我们可以通过以下代码来引用该验证码:
```html
<img src="captcha" alt="验证码">
<input type="text" name="captcha">
```
其中,`captcha` 是 Servlet 的 URL Pattern,用于请求验证码图片;`captcha` 的值是用户输入的验证码,用于验证用户输入是否正确。
最后,在后台代码中,我们可以通过以下代码来验证用户输入的验证码是否正确:
```java
String captcha = request.getParameter("captcha");
String expectedCaptcha = (String) request.getSession().getAttribute("captcha");
if (captcha == null || !captcha.equals(expectedCaptcha)) {
response.sendRedirect("login.jsp?error=captcha");
return;
}
```
其中,`captcha` 是用户输入的验证码,`expectedCaptcha` 是从 Session 中获取的正确验证码。如果两者不相等,则说明用户输入的验证码不正确,我们可以将用户重定向回登录页面,并在 URL 中添加一个 `error=captcha` 的参数,用于提示用户输入的验证码错误。
希望以上内容能够对您有所帮助。
阅读全文