请使用中文并用java web编写以下题目并给出完整代码 动态验证码程序实现动态验证。提示:在生成动态验证码的同时将其放入HttpSession对象中在网页上提取出来进行比对。
动态验证码是一种常用的防止机器人恶意攻击的手段,本题要求使用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 著作权归作者所有。请勿转载和采集!