相关博客:
- 基于Servlet的验证码技术
- 基于Java11的Base64工具类
import javax.imageio.ImageIO;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Arrays;
import java.util.Random;
public class VerifyCodeUtil {
//使用到Algerian字体,系统里没有的话需要安装字体,字体只显示大写,去掉了1,0,i,o几个容易混淆的字符
public static final String VERIFY_CODES = "23456789ABCDEFGHJKLMNPQRSTUVWXYZ";
private static Random random = new Random();
/**
* 使用系统默认字符源生成验证码
*
* @param verifySize 验证码长度
* @return
*/
public static String generateVerifyCode(int verifySize) {
return generateVerifyCode(verifySize, VERIFY_CODES);
}
/**
* 使用指定源生成验证码
*
* @param verifySize 验证码长度
* @param sources 验证码字符源
* @return
*/
public static String generateVerifyCode(int verifySize, String sources) {
if (sources == null || sources.length() == 0) {
sources = VERIFY_CODES;
}
int codesLen = sources.length();
Random rand = new Random(System.currentTimeMillis());
StringBuilder verifyCode = new StringBuilder(verifySize);
for (int i = 0; i
示例二:前后分离(★★★★★)
@RequestMapping("/getVerifyCode")
public Result getVerifyCode(HttpSession session, HttpServletResponse response) throws IOException {
String key = UUID.randomUUID().toString();
//生成验证码,5位
String code = VerifyCodeUtil.generateVerifyCode(5);
//生成验证码对应的图片
String base64Img = VerifyCodeUtil.outputImage(100, 40, code);
//将生成的数据保存在Redis中
redisUtil.hset(GlobalConstant.VERIFYCODE_KEY, key, code);
return ResultUtil.success(200, Map.of("key", key, "code", code, "img", base64Img));
}