首页 专题 文章 代码 归档

【验证码2】SpringBoot前后端分离验证码库,这个不错!

1. 前言

之前说过验证码的问题(https://www.misiai.com/articles/33.html),之前是在网上找的一个验证码工具类,验证码类型很单一,就只有一个生成验证码的功能,这次发现了一个不错的验证码类库

GitHub地址:

https://github.com/whvcse/EasyCaptcha

2. 依赖

<dependency>
   <groupId>com.github.whvcse</groupId>
   <artifactId>easy-captcha</artifactId>
   <version>1.6.2</version>
</dependency>

3. 使用

其实官方在GitHub已经说得非常非常清楚了,国内大佬开发的!是中文,也不存在看不看得明白的问题;

支持的验证码类型非常多:

1、普通英文数字字母类型

2、中文类型

3、算术类型

4、支持动态GIF

基本很完美的一个类库了!

截图-1593414313

使用:

// png类型
SpecCaptcha captcha = new SpecCaptcha(130, 48);
captcha.text();  // 获取验证码的字符
captcha.textChar();  // 获取验证码的字符数组

// gif类型
GifCaptcha captcha = new GifCaptcha(130, 48);

// 中文类型
ChineseCaptcha captcha = new ChineseCaptcha(130, 48);

// 中文gif类型
ChineseGifCaptcha captcha = new ChineseGifCaptcha(130, 48);

// 算术类型
ArithmeticCaptcha captcha = new ArithmeticCaptcha(130, 48);
captcha.setLen(3);  // 几位数运算,默认是两位
captcha.getArithmeticString();  // 获取运算的公式:3+2=?
captcha.text();  // 获取运算的结果:5

支持Base64编码(前后端分离,这个很重要):

SpecCaptcha specCaptcha = new SpecCaptcha(130, 48, 5);
specCaptcha.toBase64();

// 如果不想要base64的头部data:image/png;base64,
specCaptcha.toBase64("");  // 加一个空的参数即可

当然,前后端分离需要redis保存验证码的key,和值

我的参考代码:

ArithmeticCaptcha arithmeticCaptcha = new ArithmeticCaptcha(120, 40, 2);
String result = arithmeticCaptcha.text();
String img = arithmeticCaptcha.toBase64();
String l = RandomStringUtils.random(10, true, true);
log.info("verifyCode, key: {}, result: {}", l, result);
final VerifyCodeDto verifyCodeDto = new VerifyCodeDto(l, img);
redisUtils.set(Constant.Common.KEY_VERIFY_CODE + l, result, 1000);//存储
return AppResultBuilder.success(verifyCodeDto, ResultCode.SUCCESS);

验证是否准确封装:

public class VerifyCodeCheck {
    @Resource
    RedisUtils redisUtils;

    //检查验证码
    public void checkVerifyCode(String verifyCode, String code) throws MyException {
        if (StringUtils.isBlank(verifyCode) || StringUtils.isBlank(code)) {
            throw new MyException(ResultCode.PLEASE_VERIFY_CODE);
        }

        final String originCode = (String) redisUtils.get(Constant.Common.KEY_VERIFY_CODE + code);
        log.info("originCode ==>>{} ", originCode);

        if (originCode == null) {
            throw new MyException(ResultCode.VERIFY_CODE_EXPIRED);
        }
        if (!originCode.toLowerCase().equals(verifyCode.toLowerCase())) {
            throw new MyException(ResultCode.VERIFY_CODE_ERROR);
        }
        // 走到这一步说明验证码已经验证成功了,所以这一步 就是清除redis中的数据,同一个验证码不能一直用
        redisUtils.del(Constant.Common.KEY_VERIFY_CODE + code);
    }
}
此文阅读完毕,您可以:分享
二维码图片 扫描关注我们哟