package com.oying.modules.security.config;
|
|
import com.oying.modules.security.config.enums.LoginCodeEnum;
|
import com.wf.captcha.*;
|
import com.wf.captcha.base.Captcha;
|
import lombok.Data;
|
import lombok.Getter;
|
import com.oying.exception.BadRequestException;
|
import com.oying.utils.StringUtils;
|
import org.springframework.boot.context.properties.ConfigurationProperties;
|
import org.springframework.context.annotation.Configuration;
|
import java.awt.*;
|
|
/**
|
* 登录验证码配置信息
|
* @author Z
|
* @date 2025-01-13
|
*/
|
@Data
|
@Configuration
|
@ConfigurationProperties(prefix = "login.code")
|
public class CaptchaConfig {
|
|
/**
|
* 验证码配置
|
*/
|
@Getter
|
private LoginCodeEnum codeType;
|
|
/**
|
* 验证码有效期 分钟
|
*/
|
private Long expiration = 5L;
|
|
/**
|
* 验证码内容长度
|
*/
|
private int length = 4;
|
|
/**
|
* 验证码宽度
|
*/
|
private int width = 111;
|
|
/**
|
* 验证码高度
|
*/
|
private int height = 36;
|
|
/**
|
* 验证码字体
|
*/
|
private String fontName;
|
|
/**
|
* 字体大小
|
*/
|
private int fontSize = 25;
|
|
/**
|
* 依据配置信息生产验证码
|
* @return /
|
*/
|
public Captcha getCaptcha() {
|
Captcha captcha;
|
switch (codeType) {
|
case ARITHMETIC:
|
// 算术类型 https://gitee.com/whvse/EasyCaptcha
|
captcha = new FixedArithmeticCaptcha(width, height);
|
// 几位数运算,默认是两位
|
captcha.setLen(length);
|
break;
|
case CHINESE:
|
captcha = new ChineseCaptcha(width, height);
|
captcha.setLen(length);
|
break;
|
case CHINESE_GIF:
|
captcha = new ChineseGifCaptcha(width, height);
|
captcha.setLen(length);
|
break;
|
case GIF:
|
captcha = new GifCaptcha(width, height);
|
captcha.setLen(length);
|
break;
|
case SPEC:
|
captcha = new SpecCaptcha(width, height);
|
captcha.setLen(length);
|
break;
|
default:
|
throw new BadRequestException("验证码配置信息错误!正确配置查看 LoginCodeEnum ");
|
}
|
if(StringUtils.isNotBlank(fontName)){
|
captcha.setFont(new Font(fontName, Font.PLAIN, fontSize));
|
}
|
return captcha;
|
}
|
|
static class FixedArithmeticCaptcha extends ArithmeticCaptcha {
|
public FixedArithmeticCaptcha(int width, int height) {
|
super(width, height);
|
}
|
|
@Override
|
protected char[] alphas() {
|
// 生成随机数字和运算符
|
int n1 = num(1, 10), n2 = num(1, 10);
|
int opt = num(3);
|
|
// 计算结果
|
int res = new int[]{n1 + n2, n1 - n2, n1 * n2}[opt];
|
// 转换为字符运算符
|
char optChar = "+-x".charAt(opt);
|
|
this.setArithmeticString(String.format("%s%c%s=?", n1, optChar, n2));
|
this.chars = String.valueOf(res);
|
|
return chars.toCharArray();
|
}
|
}
|
}
|