easy-captcha实现验证码验证
前言:最近写的实验室的一个管理系统需要更改登录界面的验证码,原来使用的是若依的,但是有时确实容易看错,没有太大必要,所以就更换一个简单清晰的,在网上看了一下之后,决定更换为easy-captcha来实现
1 生成验证的流程
⬇️前端发送请求
⬇️后端接受请求并进行处理
↘️生成uuid、验证码和图片
↘️将uuid拼接上前缀与验证码code存入redis -- 同时设置超时时间
↘️将图片进行base64编码
↘️将uuid、code、img的base64编码放入统一返回对象result
⬇️后端响应请求
⬇️前端接收响应、将base64编码处理成图片显示在界面上
⬇️前端封装账号、密码和验证码同时携带uuid发送登录请求
⬇️后端处理登录请求
↘️首先通过uuid从redis中获取验证码code,同时从redis中删除该对象
➡️code为空,抛出异常
➡️code与请求发送的code不匹配,抛出异常
↘️code匹配,继续处理账号密码...
2 具体实现
2.1 首先引入依赖
<dependency>
<groupId>com.github.whvcse</groupId>
<artifactId>easy-captcha</artifactId>
<version>1.6.2</version>
</dependency>
2.2 添加captchaType配置
ruoyi:
captchaType: char
2.3 编写获取验证码的接口
/**
* 验证码操作处理
*
* @author ruoyi
*/
@RestController
public class CaptchaController
{
@Autowired
private RedisCache redisCache;
// 验证码类型
@Value("${ruoyi.captchaType}")
private String captchaType;
/**
* 生成验证码 使用easy-captcha
* @param response
* @return
* @throws IOException
*/
@GetMapping("/captchaImage")
public AjaxResult getCode(HttpServletResponse response) throws IOException{
// 保存验证码信息
String uuid = IdUtils.simpleUUID();
String verifyKey = Constants.CAPTCHA_CODE_KEY + uuid; // 存入redis的键值
String capStr = null, code = null;
BufferedImage image = null;
//验证码EasyCaptcha工具
Captcha captcha = null;
if ("math".equals(captchaType)) {
//创建算术验证码
captcha = new ArithmeticCaptcha(115, 42);
} else if ("chinese".equals(captchaType)) {
//中文验证
captcha = new ChineseCaptcha(115, 42);
} else if ("char".equals(captchaType)) {
//创建字符验证码
captcha = new SpecCaptcha(115,42);
}
code = captcha.text();
redisCache.setCacheObject(verifyKey, code, Constants.CAPTCHA_EXPIRATION, TimeUnit.MINUTES);
AjaxResult ajax = AjaxResult.success();
ajax.put("uuid",uuid);
String base64 = captcha.toBase64();
ajax.put("img",base64.substring(base64.indexOf(',')+1));
return ajax;
}
}
2.4 编写验证代码
public String login(String username, String password, String code, String uuid){
String verifyKey = Constants.CAPTCHA_CODE_KEY + uuid;
String captcha = redisCache.getCacheObject(verifyKey);
redisCache.deleteObject(verifyKey);
if (captcha == null)
{
AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire")));
throw new CaptchaExpireException();
}
if (!code.equalsIgnoreCase(captcha))
{
AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.error")));
throw new CaptchaException();
}
// 用户验证...
}
参考文章:https://blog.csdn.net/qq_47425247/article/details/125553351