21xrx.com
2025-04-13 02:06:20 Sunday
文章检索 我的文章 写文章
Java验证码代码实现及讲解
2023-06-16 21:11:03 深夜i     12     0
Java 验证码 安全性

在使用Java开发网络应用程序时,验证码的使用是非常常见的。验证码的主要作用是防止机器自动提交表单等恶意行为,提高应用程序的安全性。

在Java中,实现验证码的方法有很多种,其中最简单的一种是使用Java Servlet中提供的验证码库。该库提供了生成验证码图片的方法,以及验证验证码输入是否正确的方法。

下面我们来看一下如何使用Java Servlet中的验证码库来实现验证码功能。

首先,我们需要导入以下两个类库:

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
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;

然后,我们可以定义一个Servlet类,例如下面的代码所示:

public class VerifyCodeServlet extends HttpServlet {
  public VerifyCodeServlet() {
    super();
  }
  protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // 定义图像宽度和高度
    int width = 100;
    int height = 50;
    // 创建一个随机数生成器
    Random random = new Random();
    // 创建一个缓存图像对象
    BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
    // 获取图形上下文对象
    Graphics graphics = image.getGraphics();
    // 绘制背景色
    graphics.setColor(Color.WHITE);
    graphics.fillRect(0, 0, width, height);
    // 设置字体
    Font font = new Font("Arial", Font.BOLD, 18);
    graphics.setFont(font);
    // 生成随机验证码
    String code = "";
    for (int i = 0; i < 4; i++) {
      int n = random.nextInt(10);
      code += n;
      graphics.setColor(new Color(random.nextInt(255), random.nextInt(255), random.nextInt(255)));
      graphics.drawString(String.valueOf(n), 20 + i * 20, 35);
    }
    // 将验证码存储在Session中
    HttpSession session = request.getSession();
    session.setAttribute("verifyCode", code);
    // 绘制干扰线
    graphics.setColor(Color.GRAY);
    for (int i = 0; i < 10; i++) {
      int x = random.nextInt(width);
      int y = random.nextInt(height);
      int x1 = random.nextInt(width);
      int y1 = random.nextInt(height);
      graphics.drawLine(x, y, x1, y1);
    }
    // 结束绘制
    graphics.dispose();
    // 输出图像到客户端
    response.setContentType("image/jpeg");
    ServletOutputStream outputStream = response.getOutputStream();
    javax.imageio.ImageIO.write(image, "jpeg", outputStream);
    outputStream.close();
  }
  protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    doGet(request, response);
  }
}

上面的代码实现了一个简单的验证码生成和输出。首先,我们定义了一个100像素宽、50像素高的图片缓冲区,并填充了一个白色背景。接着,我们生成了一个4位的随机数字作为验证码,将其作为字符串绘制到图片上。同时,我们将验证码存储在Session中以备后续验证。最后,我们绘制了一些干扰线,并将图片输出给客户端。

使用该验证码的代码可以看做是下面这样:

public boolean validate(HttpServletRequest request) {
  String verifyCode = (String) request.getSession().getAttribute("verifyCode");
  String userInput = request.getParameter("verifyCode");
  if (verifyCode == null || userInput == null || !verifyCode.equals(userInput))
    return false;
   else
    return true;
  
}

上面的代码实现了验证用户输入验证码是否正确的功能。我们只需要从Session中获取之前生成的验证码,然后将用户输入的验证码进行比对即可。

综上所述,Java中的验证码实现非常简单,只需使用一些基本的图像操作即可完成。该技术可以有效加强应用程序的安全性并防止机器人攻击。

  
  

评论区