JSP实现验证码:Servlet实战指南

简介

在当今网络时代,保护Web应用程序免受恶意攻击至关重要。验证码作为一种简单有效的安全措施,被广泛用于防止机器人程序的自动化操作,例如暴力破解密码、垃圾邮件发送等。

本文将为您提供一个使用JSP和Servlet实现验证码的完整指南。我们将逐步讲解代码,并提供实际应用的建议。

1. 创建CaptchaServlet

首先,我们需要创建一个名为'CaptchaServlet.java'的Servlet,它负责生成验证码图片并验证用户输入。javaimport 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 WIDTH = 120;    private static final int HEIGHT = 40;    private static final int FONT_SIZE = 20;    private static final int CODE_LENGTH = 4;

private static final String SESSION_CAPTCHA_KEY = 'captcha';

private static final char[] CHARS = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',            'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',            'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '0', '1', '2', '3', '4',            '5', '6', '7', '8', '9' };

@Override    protected void doGet(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        HttpSession session = request.getSession();

    BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);        Graphics g = image.getGraphics();

    Random random = new Random();        g.setColor(getRandColor(200, 250));        g.fillRect(0, 0, WIDTH, HEIGHT);        g.setFont(new Font('Times New Roman', Font.PLAIN, FONT_SIZE));

    // 生成随机验证码        StringBuilder sb = new StringBuilder();        for (int i = 0; i < CODE_LENGTH; i++) {            char c = CHARS[random.nextInt(CHARS.length)];            sb.append(c);            g.setColor(new Color(20 + random.nextInt(110), 20 + random.nextInt(110), 20 + random.nextInt(110)));            g.drawString(String.valueOf(c), i * (WIDTH / CODE_LENGTH) + 5, HEIGHT / 2 + FONT_SIZE / 2 - 5);        }

    // 将验证码存入 Session        session.setAttribute(SESSION_CAPTCHA_KEY, sb.toString());

    // 绘制干扰线        for (int i = 0; i < 8; i++) {            g.setColor(getRandColor(40, 150));            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);        }

    g.dispose();

    // 输出图片        response.setContentType('image/jpeg');        ImageIO.write(image, 'JPEG', response.getOutputStream());    }

@Override    protected void doPost(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        HttpSession session = request.getSession();

    // 获取用户输入的验证码        String captcha = request.getParameter('captcha');

    // 获取 Session 中的验证码        String sessionCaptcha = (String) session.getAttribute(SESSION_CAPTCHA_KEY);

    // 验证码比较不区分大小写        if (captcha != null && captcha.equalsIgnoreCase(sessionCaptcha)) {            response.getWriter().write('验证码正确');        } else {            response.getWriter().write('验证码错误');        }    }

private Color getRandColor(int fc, int bc) {        Random random = new Random();        if (fc > 255)            fc = 255;        if (bc > 255)            bc = 255;        int r = fc + random.nextInt(bc - fc);        int g = fc + random.nextInt(bc - fc);        int b = fc + random.nextInt(bc - fc);        return new Color(r, g, b);    }

}

代码解析:

  • 该Servlet继承自HttpServlet,并实现了doGetdoPost方法。* doGet方法负责生成验证码图片: * 创建一个BufferedImage对象来存储生成的图像。 * 使用Graphics对象在图像上绘制随机字符、干扰线和背景颜色。 * 将生成的验证码字符串存储在用户Session中。 * 将图像以JPEG格式输出到客户端。* doPost方法负责验证用户输入的验证码: * 从请求参数中获取用户输入的验证码。 * 从用户Session中获取之前生成的验证码。 * 比较两个验证码是否匹配(忽略大小写)。 * 向客户端输出验证结果。

2. 集成到JSP页面

接下来,我们需要在JSP页面中添加验证码图片和输入框。html<%@ page language='java' contentType='text/html; charset=UTF-8' pageEncoding='UTF-8'%>验证码示例

验证码示例

验证码

代码解析:

  • 该JSP页面包含一个表单,用于提交用户输入的验证码。* 表单中包含一个文本框,用于用户输入验证码。* 表单中还包含一个img标签,用于显示生成的验证码图片。img标签的src属性指向CaptchaServlet,这意味着每次请求该页面时,都会调用CaptchaServlet生成新的验证码图片。

3. 运行应用程序

完成以上步骤后,您就可以运行应用程序并访问JSP页面了。您将看到生成的验证码图片和输入框。输入正确的验证码,提交表单后会提示'验证码正确',否则会提示'验证码错误'。

安全建议

  • 在实际应用中,您需要根据具体的业务需求对验证码进行更加严格的验证和保护,以防止恶意攻击和滥用。* 例如,您可以: * 增加验证码的复杂度,例如使用更复杂的字符组合、添加干扰元素等。 * 限制验证码的有效时间和尝试次数。 * 在用户输入验证码错误多次后,采取相应的安全措施,例如锁定用户账号、记录IP地址等。

总结

本文提供了一个使用JSP和Servlet实现验证码的简单示例。您可以根据自己的需求对代码进行修改和扩展,以构建更加安全可靠的Web应用程序。

JSP实现验证码:Servlet实战指南

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

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