「Java 开发工具」Java原生代码实现验证码图片生成

211 阅读2分钟

在网站的开发过程中,许多注册登入都会使用到验证码。所以......

一、Java实现后台验证码-完整代码
package test;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Random;

import javax.imageio.ImageIO;
/**
 * 使用java生成验证码图像
 * @author Drew
 *
 */
public final class ImageUtil {
    
    public static final char[] chars = {
        '0','1','2','3','4','5','6','7','8','9',
        'A','B','C','D','E','F','G','H','I','K',
        'J','L','M','N','O','P','Q','R','S','T',
        'U','V','W','X','Y','Z'
    };
    private static final int SIZE = 6;      /*字母数量*/
    private static final int LINES = 22;    /*线条数量*/
    private static final int WIDTH = 160;   /*图片宽度*/
    private static final int HEIGHT = 40;   /*图片高度*/
    private static final int FONT_SIZE = 30;  /*字体大小*/
    
    /**
     * 生成随机验证码以及图片
     * Object[0]:验证码字符串string
     * Object[1]:验证码图片
     * 
     * 1.创建空白图片
     * 2.获取图片画笔
     * 3.设置画笔颜色
     * 4.绘制矩形背景
     * 5.绘制随机字符
     * 6.绘制干扰线
     * 7.返回验证码和图片
     */
    public static Object[] createImage(){
        StringBuffer sb= new StringBuffer();
        BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
        Graphics graphics = image.getGraphics();
        graphics.setColor(Color.LIGHT_GRAY);
        graphics.fillRect(0, 0, WIDTH, HEIGHT);
        Random random = new Random();
        for (int i = 0; i < SIZE; i++) {
            int n = random.nextInt(chars.length);//取随机字符索引
            graphics.setColor(getRandomColor());//设置随机颜色
            //设置字体大小(Font.SERIF字体设置,可以对其每个字符进行字体随机)
            graphics.setFont(new Font(getRandomFont(), Font.BOLD+Font.ITALIC, FONT_SIZE));
            //绘制字符
            graphics.drawString(chars[n]+"", i*WIDTH/SIZE, HEIGHT/2);
            sb.append(chars[n]);//记录字符
        }
        for (int i = 0; i < LINES; i++) {
            graphics.setColor(getRandomColor());//设置随机颜色
            //随机绘制线条
            graphics.drawLine(random.nextInt(WIDTH), random.nextInt(HEIGHT),random.nextInt(WIDTH), random.nextInt(HEIGHT));
        }
        System.out.println(sb.toString());//打印在后台,用于验证输入是否匹配。
        return new Object[]{sb.toString(),image};//返回验证码和图片
    }
    
    /**
     * 随机选取颜色
     * @return
     */
    private static Color getRandomColor() {
        Random random = new Random();
        Color color = new Color(random.nextInt(256),random.nextInt(256),random.nextInt(256));
        return color;
    }
    
    /**
     * 随机选择字体
     * @return
     */
    private static String getRandomFont(){
    	String[] font = {"SansSerif","Serif","微软雅黑","楷体","宋体","黑体","隶书"};
    	Random random = new Random();
    	return font[random.nextInt(font.length)];
    }

/**
 * main测试方法
 * @param args
 * @throws IOException 
 */
    public static void main(String[] args) throws IOException {
        Object[] objs = createImage();
        BufferedImage image = (BufferedImage) objs[1];
        OutputStream os = new FileOutputStream("C:/Users/Drew/Desktop/x.png");
        ImageIO.write(image, "png", os);
        os.close();
    }

}

二、结果展示

image.png

image.png

image.png

三、问题:如何使用JavaScript前台来设计验证码呢?

这个问题就留给全栈的小伙伴 啦~ 🤭


🙏至此,感谢阅读🙏

美女2.png