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