java验证码

package com.jhinno.appportal.verifyCode;

import java.awt.*;
import java.awt.image.BufferedImage;
import java.util.Random;

/**
* @Author: zewang
* @Date: 2021/12/17/0017 10:45
*/
public class VerifyCode {

public static String drawRandomText(int width, int height, BufferedImage verifyImg) {
Graphics2D graphics = (Graphics2D) verifyImg.getGraphics();
//设置画笔颜色-验证码背景色
graphics.setColor(Color.WHITE);
//填充背景
graphics.fillRect(0, 0, width, height);
graphics.setFont(new Font("微软雅黑", Font.BOLD, 22));
//数字和字母的组合
String baseNumLetter = "123456789abcdefghijklmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ";
StringBuffer sBuffer = new StringBuffer();
//旋转原点的 x 坐标
int x = 10;
String ch = "";
Random random = new Random();
for (int i = 0; i < 4; i++) {
graphics.setColor(getRandomColor());
//设置字体旋转角度
//角度小于20度
int degree = random.nextInt() % 20;
int dot = random.nextInt(baseNumLetter.length());
ch = baseNumLetter.charAt(dot) + "";
sBuffer.append(ch);
//正向旋转
graphics.rotate(degree * Math.PI / 180, x, 25);
graphics.drawString(ch, x, 25);
//反向旋转
graphics.rotate(-degree * Math.PI / 180, x, 25);
x += 20;
}
//画干扰线
for (int i = 0; i < 4; i++) {
// 设置随机颜色
graphics.setColor(getRandomColor());
// 随机画线
graphics.drawLine(random.nextInt(width), random.nextInt(height),
random.nextInt(width), random.nextInt(height));
}
//添加噪点
for (int i = 0; i < 20; i++) {
int x1 = random.nextInt(width);
int y1 = random.nextInt(height);
graphics.setColor(getRandomColor());
graphics.fillRect(x1, y1, 2, 2);
}
return sBuffer.toString();
}

/**
* 随机取色
*/
private static Color getRandomColor() {
Random ran = new Random();
Color color = new Color(ran.nextInt(256),
ran.nextInt(256), ran.nextInt(256));
return color;

}
}


try {
HashMap<String, String> hashMap = new HashMap<>();
//生成对应宽高的初始图片
int width = 90;
int height = 40;
BufferedImage verifyImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
//单独的一个类方法,出于代码复用考虑,进行了封装。
//功能是生成验证码字符并加上噪点,干扰线,返回值为验证码字符
String randomText = VerifyCode.drawRandomText(width, height, verifyImg);
//获取输出流读取照片
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
//输出图片流
ImageIO.write(verifyImg, "png", outputStream);
//将图片转为base64字符串给前端页面做展示
BASE64Encoder encoder = new BASE64Encoder();
String base64 = encoder.encodeBuffer(outputStream.toByteArray()).trim();
base64 = base64.replaceAll("\n", "").replaceAll("\r", "");
//图片的base64编码
hashMap.put("code", "data:image/jpg;base64," + base64);
//将后台生成的校验码值存入redis
String verifyCodeId = "yzm"+randomText + "_" + UUID.randomUUID().toString();
Jedis jedis = RedisClient.getInstance().getConnection();
//传回前端
//验证码
hashMap.put("verifyCode", randomText);
//验证码id
hashMap.put("verifyCodeId", verifyCodeId);
logger.info("verifyCode:" + randomText + ";verifyCodeId:" + verifyCodeId);
result.setData(hashMap);
result.success();
} catch (Exception e) {
logger.error(e);
result.failed();
}














posted @   鲁班大师智商二百五  阅读(56)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示