利用Java进行验证码的实现——算数验证码

发布于:2025-06-19 ⋅ 阅读:(10) ⋅ 点赞:(0)

我主要使用使用 Java Swing 库创建一个 GUI 窗口,然后在窗口中显示生成的算术验证码图片,并提供一个文本框和一个按钮,输入验证码并验证显示结果。

代码如下:

package calculate;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
public class ArithmeticValidateCodeExample extends JFrame implements ActionListener {
    private static final int WIDTH = 100;     // 图片宽度
    private static final int HEIGHT = 80;     // 图片高度
    private static final int FONT_SIZE = 20;  // 字体大小
    private BufferedImage image;              // 验证码图片
    private String arithmeticExpression;       // 算术表达式
    private int arithmeticResult;              // 算术表达式的结果
    private JLabel label;                      // 显示算术表达式和"请输入验证码结果"
    private JTextField textField;              // 获取用户输入的结果
    public ArithmeticValidateCodeExample() {
        // 生成算术表达式和结果
        arithmeticExpression = generateArithmeticExpression();
        arithmeticResult = calculateArithmeticExpression(arithmeticExpression);
        // 创建验证码图片
        image = generateValidateCodeImage(arithmeticExpression);
        // 设置JFrame的属性
        setSize(WIDTH + 80, HEIGHT + 100);  // 加上100的高度为了留出空间放"请输入验证码结果"和输入框
        setLocationRelativeTo(null);
        setTitle("算数验证码");
        // 创建一个JLabel用于显示验证码图片
        JLabel imageLabel = new JLabel(new ImageIcon(image));
        getContentPane().add(imageLabel, BorderLayout.NORTH);
        // 添加"请输入验证码结果"和输入框及"验证"按钮
        label = new JLabel("请输入验证码结果:");
        textField = new JTextField(8);
        JButton button = new JButton("验证");
        button.addActionListener(this);
        JPanel inputPanel = new JPanel(new FlowLayout());
        inputPanel.add(label);
        inputPanel.add(textField);
        inputPanel.add(button);
        getContentPane().add(inputPanel, BorderLayout.CENTER);
    }
    public static void main(String[] args) {
        ArithmeticValidateCodeExample example = new ArithmeticValidateCodeExample();
        example.setVisible(true);
        example.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
    @Override
    public void actionPerformed(ActionEvent e) {
        String userInput = textField.getText();
        int userResult = Integer.parseInt(userInput);
        if (userResult == arithmeticResult) {
            JOptionPane.showMessageDialog(null, "验证通过!");
        } else {
            JOptionPane.showMessageDialog(null, "验证失败!");
        }
    }
    private static String generateArithmeticExpression() {
        int number1 = (int) (Math.random() * 100);
        int number2 = (int) (Math.random() * 100);
        int operator = (int) (Math.random() * 4);
        char operatorChar;
        switch (operator) {
            case 0:
                operatorChar = '+';
                break;
            case 1:
                operatorChar = '-';
                break;
            case 2:
                operatorChar = '*';
                break;
            case 3:
                operatorChar = '/';
                break;
            default:
                operatorChar = '+';
        }
        return number1 + " " + operatorChar + " " + number2;
    }
    private static int calculateArithmeticExpression(String arithmeticExpression) {
        String[] components = arithmeticExpression.split(" ");
        int number1 = Integer.parseInt(components[0]);
        char operator = components[1].charAt(0);
        int number2 = Integer.parseInt(components[2]);
        int result;
        switch (operator) {
            case '+':
                result = number1 + number2;
                break;
            case '-':
                result = number1 - number2;
                break;
            case '*':
                result = number1 * number2;
                break;
            case '/':
                result = number1 / number2;
                break;
            default:
                result = 0;
        }
        return result;
    }
    private static BufferedImage generateValidateCodeImage(String arithmeticExpression) {
        BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
        Graphics2D g = image.createGraphics();
        // 设置背景颜色
        g.setColor(Color.WHITE);
        g.fillRect(0, 0, WIDTH, HEIGHT);
        // 设置字体样式和大小
        Font font = new Font(Font.DIALOG, Font.BOLD, FONT_SIZE);
        g.setFont(font);
        // 设置验证码文本颜色
        g.setColor(Color.BLACK);
        // 绘制算术表达式的文本
        g.drawString(arithmeticExpression, 10, HEIGHT / 2 - FONT_SIZE);
        // 添加干扰线
        for (int i = 0; i < 5; i++) {
            int x1 = (int) (Math.random() * WIDTH);
            int y1 = (int) (Math.random() * HEIGHT);
            int x2 = (int) (Math.random() * WIDTH);
            int y2 = (int) (Math.random() * HEIGHT);
            g.drawLine(x1, y1, x2, y2);
        }
        // 噪点数量
        int noiseCount = WIDTH * HEIGHT / 5;
        for (int i = 0; i < noiseCount; i++) {
            int x = (int) (Math.random() * WIDTH);
            int y = (int) (Math.random() * HEIGHT);
            int rgb = getRandomColor().getRGB();
            image.setRGB(x, y, rgb);
        }
        g.dispose();
        return image;
    }
    private static Color getRandomColor() {
        int r = (int) (Math.random() * 256);
        int g = (int) (Math.random() * 256);
        int b = (int) (Math.random() * 256);
        return new Color(r, g, b);
    }
}

 

 


网站公告

今日签到

点亮在社区的每一天
去签到