package com.valid.main;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import com.octo.captcha.CaptchaFactory;
import com.octo.captcha.component.image.backgroundgenerator.UniColorBackgroundGenerator;
import com.octo.captcha.component.image.color.RandomRangeColorGenerator;
import com.octo.captcha.component.image.fontgenerator.RandomFontGenerator;
import com.octo.captcha.component.image.textpaster.DecoratedRandomTextPaster;
import com.octo.captcha.component.image.textpaster.RandomTextPaster;
import com.octo.captcha.component.image.textpaster.TextPaster;
import com.octo.captcha.component.image.textpaster.textdecorator.BaffleTextDecorator;
import com.octo.captcha.component.image.textpaster.textdecorator.TextDecorator;
import com.octo.captcha.component.image.wordtoimage.ComposedWordToImage;
import com.octo.captcha.component.word.FileDictionary;
import com.octo.captcha.component.word.wordgenerator.ComposeDictionaryWordGenerator;
import com.octo.captcha.component.word.wordgenerator.DummyWordGenerator;
import com.octo.captcha.component.word.wordgenerator.WordGenerator;
import com.octo.captcha.engine.GenericCaptchaEngine;
import com.octo.captcha.image.gimpy.GimpyFactory;
import com.octo.captcha.service.image.ImageCaptchaService;
import com.octo.captcha.service.multitype.GenericManageableCaptchaService;
/**
* 验证码管理工具类
* @Author 朱腾
* @Time 2023年7月28日
*/
public class ValidCodeUtil
{
//K:sessionid,V:ImageCaptchaService
private static final Map<String, ImageCaptchaService> serviceMap = new HashMap<>();
//验证码服务
public static ImageCaptchaService getService(String sessionid)
{
//生成新的验证码服务
ImageCaptchaService service = generatorImageService();
serviceMap.put(sessionid, service);
return service;
}
/**
* 执行验证码验证
* @Author 朱腾
* @Time 2023年7月29日
*/
public static boolean validateCode(String sessionid, String code)
{
try
{
ImageCaptchaService service = serviceMap.get(sessionid);
return service.validateResponseForID(sessionid, code);
}
catch (Exception e)
{
return false;
}
}
/**
* 生成随机数图片
* @Author 朱腾
* @Time 2023年7月28日
*/
public static GenericManageableCaptchaService generatorImageService()
{
//文字生成和字数控制相关配置
RandomTextPaster text = null;
{
int[] R = {0, 120};//参数:RGBA中【R】的取值范围
int[] G = {0, 120};//参数:RGBA中【G】的取值范围
int[] B = {0, 155};//参数:RGBA中【B】的取值范围
//随机颜色初始化配置
RandomRangeColorGenerator colors = new RandomRangeColorGenerator(R, G, B);
Integer minLength = 4;//生成文字最低阈值
Integer maxLength = 4;//生成文字最高阈值
Boolean colorManage = true;//是否启用颜色管理,默认不开启区分《每个文字渲染不同的颜色》
text = new RandomTextPaster(minLength, maxLength, colors, colorManage);
}
//图片尺寸和背景色
UniColorBackgroundGenerator bgColor = null;
{
Integer width = 200;//幕布宽度:单位是‘像素’
Integer height = 70;//幕布高度:单位是‘像素’
//Color color=Color.LIGHT_GRAY;//图片背景色,可以将注释掉的两个参数追加到下方入参中
RandomRangeColorGenerator randomColor = null;//随机背景色
{
int[] R = new int[] {160, 200};
int[] G = new int[] {150, 190};
int[] B = new int[] {220, 255};
randomColor = new RandomRangeColorGenerator(R, G, B);//随机背景色
}
bgColor = new UniColorBackgroundGenerator(width, height, randomColor);
}
//随机生成的字体大小和字体类型,参数1和2表示最小和最大的字体大小,第三个表示随机的字体
RandomFontGenerator fontGen = null;
{
Integer minSize = 50;//在随机生成文字时,最小文字字体大小
Integer maxSize = 50;//在随机生成文字时,最高文字字体大小
Font[] fs = new Font[] {new Font("Arial", 0, 10), new Font("Tahoma", 0, 10)};
fontGen = new RandomFontGenerator(minSize, maxSize, fs);
}
//图像构建
ComposedWordToImage image = new ComposedWordToImage(fontGen, bgColor, text);
//随机文本初始化
FileDictionary fd = new FileDictionary("toddlist");
//字典文本生成的对象
ComposeDictionaryWordGenerator cdwg = new ComposeDictionaryWordGenerator(fd);
GimpyFactory gf = new GimpyFactory(cdwg, image);
//创建图片生成引擎
GenericCaptchaEngine gce = new GenericCaptchaEngine(new CaptchaFactory[] {gf});
GenericManageableCaptchaService gmc = null;
{
Integer expireTime = 180;//失效时长,计算单位:秒
Integer maxStory = 200000;//最大缓存
gmc = new GenericManageableCaptchaService(gce, expireTime, maxStory);
}
return gmc;
}
/**
* 生成随机数
* @Author 朱腾
* @Time 2023年7月28日
*/
private static String generateRadomText()
{
//生成的文本内容,该内容将显示在验证码图片中
StringBuffer textContent = new StringBuffer();
//中文数字
String[] numC = {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};
//阿拉伯数字
int[] nums = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
//运算字符
String[] signs = {"+", "-", "x"};
String[] signC = {"加", "减", "乘"};
//计算随机数
Random ra = new Random();
int num1 = ra.nextInt(nums.length);//数字“数组”下标:第一个数字
int num2 = ra.nextInt(nums.length);//数字“数组”下标:第二个数字
int signIndex = ra.nextInt(signs.length);
String sign = signs[signIndex];//计算公式英文符号
//获取随机的《中文或者英文字符》
String signRd = "";
{
//从中文或者英文字符中随机取一个
String[] rSigns = {signs[signIndex], signC[signIndex]};
signRd = rSigns[ra.nextInt(rSigns.length)];//计算符号:随机的,中文或者英文字符
}
String no1 = "";//第一个数字
String no2 = "";//第二个数字
{
String[] rn1 = {numC[num1], String.valueOf(nums[num1])};
String[] rn2 = {numC[num2], String.valueOf(nums[num2])};
no1 = rn1[ra.nextInt(rn1.length)];
no2 = rn2[ra.nextInt(rn1.length)];
}
//初始化公式
textContent.append(no1).append(" ").append(signRd).append(" ").append(no2).append(" = ? ");
int result = 0;
//计算公式结果
switch (sign)
{
case "+":
{
result = nums[num1] + nums[num2];
break;
}
case "-":
{
result = nums[num1] - nums[num2];
break;
}
case "x":
{
result = nums[num1] * nums[num2];
break;
}
}
System.out.println(textContent.