JSP实现验证码:Servlet实战指南
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,并实现了doGet和doPost方法。*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应用程序。
原文地址: https://www.cveoy.top/t/topic/f1CR 著作权归作者所有。请勿转载和采集!