动态验证码是一种常用的防止机器人恶意攻击的手段,本题要求使用Java Web编写一个生成动态验证码的程序,并将生成的验证码存入HttpSession对象中,以便在网页上进行比对验证。

以下是完整的Java Web代码实现:

// DynamicCaptchaServlet.java 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 DynamicCaptchaServlet extends HttpServlet {

private static final long serialVersionUID = 1L;

private static final int WIDTH = 120; // 验证码图片的宽度
private static final int HEIGHT = 30; // 验证码图片的高度
private static final int CODE_LEN = 4; // 验证码的长度

private static final String SESSION_KEY = "captcha"; // HttpSession中存储验证码的键名

private static final Random random = new Random();

// 随机生成一个验证码
private String generateCaptcha() {
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < CODE_LEN; i++) {
        int num = random.nextInt(10);
        sb.append(num);
    }
    return sb.toString();
}

// 在HttpSession中存储验证码
private void storeCaptcha(HttpSession session, String captcha) {
    session.setAttribute(SESSION_KEY, captcha);
}

// 从HttpSession中获取验证码
private String retrieveCaptcha(HttpSession session) {
    return (String) session.getAttribute(SESSION_KEY);
}

// 绘制验证码图片
private void drawCaptchaImage(Graphics g, String captcha) {
    g.setColor(Color.WHITE);
    g.fillRect(0, 0, WIDTH, HEIGHT);
    g.setColor(Color.BLACK);
    g.setFont(new Font("Arial", Font.BOLD, 20));
    for (int i = 0; i < CODE_LEN; i++) {
        int x = i * WIDTH / CODE_LEN + 10;
        int y = HEIGHT / 2 + random.nextInt(10) - 5;
        g.drawString(String.valueOf(captcha.charAt(i)), x, y);
    }
    for (int i = 0; i < 10; i++) {
        g.setColor(new Color(random.nextInt(256), random.nextInt(256), random.nextInt(256)));
        int x1 = random.nextInt(WIDTH);
        int y1 = random.nextInt(HEIGHT);
        int x2 = random.nextInt(WIDTH);
        int y2 = random.nextInt(HEIGHT);
        g.drawLine(x1, y1, x2, y2);
    }
}

// 处理GET请求,生成验证码并存储到HttpSession中
protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    String captcha = generateCaptcha();
    storeCaptcha(request.getSession(), captcha);
    BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
    Graphics g = image.getGraphics();
    drawCaptchaImage(g, captcha);
    g.dispose();
    ImageIO.write(image, "JPEG", response.getOutputStream());
}

// 处理POST请求,比对用户输入的验证码和HttpSession中存储的验证码是否一致
protected void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    String userInput = request.getParameter("captcha");
    String storedCaptcha = retrieveCaptcha(request.getSession());
    if (userInput != null && userInput.equals(storedCaptcha)) {
        response.getWriter().println("验证码正确");
    } else {
        response.getWriter().println("验证码错误");
    }
}

}

在代码中,generateCaptcha()方法用于随机生成一个4位数字的验证码,storeCaptcha()方法用于将验证码存入HttpSession对象中,retrieveCaptcha()方法用于从HttpSession对象中获取验证码,drawCaptchaImage()方法用于绘制验证码图片,doGet()方法用于生成验证码并存储到HttpSession对象中,doPost()方法用于比对用户输入的验证码和HttpSession中存储的验证码是否一致。

使用Servlet容器(如Tomcat)部署上述代码后,可以通过访问DynamicCaptchaServlet的URL来获取验证码图片,例如:

http://localhost:8080/DynamicCaptchaServlet

在网页上显示验证码图片的同时,也可以提取出验证码的值(通过JavaScript或其他方式),将用户输入的验证码和服务器端存储的验证码进行比对验证。


原文地址: https://www.cveoy.top/t/topic/bfkp 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录