easy-captcha實現驗證碼驗證

yuqiu2004發表於2024-07-15

前言:最近寫的實驗室的一個管理系統需要更改登入介面的驗證碼,原來使用的是若依的,但是有時確實容易看錯,沒有太大必要,所以就更換一個簡單清晰的,在網上看了一下之後,決定更換為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

相關文章