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

posted @ 2024-07-15 16:52  yuqiu2004  阅读(108)  评论(0编辑  收藏  举报