SpringBoot+Hutool實現(xiàn)圖片驗證碼的示例代碼
圖片驗證碼在注冊、登錄、交易、交互等各類場景中都發(fā)揮著巨大作用,能夠防止操作者利用機器進行暴力破解、惡意注冊、濫用服務(wù)、批量化操作和自動發(fā)布等行為。

創(chuàng)建一個實體類封裝,給前端返回的驗證碼數(shù)據(jù):
@Data
public class ValidateCodeVo {
private String codeKey ; // 驗證碼的key
private String codeValue ; // 圖片驗證碼對應(yīng)的字符串數(shù)據(jù)
}
業(yè)務(wù)層代碼實現(xiàn):
public interface ValidateCodeService {
// 獲取驗證碼圖片
public abstract ValidateCodeVo generateValidateCode();
}
@Service
public class ValidateCodeServiceImpl implements ValidateCodeService {
?
@Autowired
private RedisTemplate<String , String> redisTemplate ;
?
@Override
public ValidateCodeVo generateValidateCode() {
?
// 使用hutool工具包中的工具類生成圖片驗證碼
//參數(shù):寬 高 驗證碼位數(shù) 干擾線數(shù)量
CircleCaptcha circleCaptcha = CaptchaUtil.createCircleCaptcha(150, 48, 4, 20);
String codeValue = circleCaptcha.getCode();
String imageBase64 = circleCaptcha.getImageBase64();
?
// 生成uuid作為圖片驗證碼的key
String codeKey = UUID.randomUUID().toString().replace("-", "");
?
// 將驗證碼存儲到Redis中
redisTemplate.opsForValue().set("user:login:validatecode:" + codeKey , codeValue , 5 , TimeUnit.MINUTES);
?
// 構(gòu)建響應(yīng)結(jié)果數(shù)據(jù)
ValidateCodeVo validateCodeVo = new ValidateCodeVo() ;
validateCodeVo.setCodeKey(codeKey);
validateCodeVo.setCodeValue("data:image/png;base64," + imageBase64);
?
// 返回數(shù)據(jù)
return validateCodeVo;
}
?
}
在Controller中添加獲取驗證碼接口方法:
@Autowired
private ValidateCodeService validateCodeService;
@GetMapping(value = "/generateValidateCode")
public Result<ValidateCodeVo> generateValidateCode() {
ValidateCodeVo validateCodeVo = validateCodeService.generateValidateCode();
return Result.build(validateCodeVo , ResultCodeEnum.SUCCESS) ;
}
在登錄的業(yè)務(wù)層實現(xiàn)驗證碼校驗:
/**
* 用戶登錄
* @param loginDto
* @return
*/
@Override
public LoginVo login(LoginDto loginDto) {
//獲取輸入的驗證碼和存儲到redis的key名稱
String captcha = loginDto.getCaptcha();
String key = loginDto.getCodeKey();
//根據(jù)獲取的redis的key 查詢redis里面存儲的驗證碼
String redisCode = redisTemplate.opsForValue().get("user:validate" + key);
// 比較輸入的和redis存儲驗證碼是否一致
if(StrUtil.isEmpty(redisCode) || !StrUtil.equalsIgnoreCase(redisCode,captcha)){
//提示用戶,校驗失敗
throw new GuiguException(ResultCodeEnum.VALIDATECODE_ERROR);
}
// 如果一致,刪除redis里面驗證碼
redisTemplate.delete("user:validate" + key);
// 1.獲取提交的用戶名
String userName = loginDto.getUserName();
// 2.根據(jù)用戶名查詢用戶表
SysUser sysUser = sysUserMapper.selectUserInfoByUserName(userName);
// 3.如果根據(jù)用戶名查不到對應(yīng)的信息,用戶不存在,返回錯誤信息
if(sysUser == null){
//throw new RuntimeException("用戶名不存在");
throw new GuiguException(ResultCodeEnum.LOGIN_ERROR);
}
// 4.根據(jù)用戶名查詢用戶信息,用戶存在
// 5.獲取輸入的密碼,比較輸入的密碼和數(shù)據(jù)庫的密碼是否一致
String database_assword = sysUser.getPassword();
// 把輸入的密碼進行加密 再比較數(shù)據(jù)庫的密碼
String input_password = DigestUtils.md5DigestAsHex(loginDto.getPassword().getBytes());
//比較
if(!input_password.equals(database_assword)){
// throw new RuntimeException("密碼不正確");
throw new GuiguException(ResultCodeEnum.LOGIN_ERROR);
}
// 6.如果密碼一致,登陸成功,如果你密碼不一致登陸失敗
// 7.登陸成功,生產(chǎn)用戶的唯一標識token
String token = UUID.randomUUID().toString().replaceAll("-", "");
// 8.把登陸成功的用戶信息放到redis里面
// key:token value:用戶信息
redisTemplate.opsForValue().set("user:login"+token,JSON.toJSONString(sysUser),7, TimeUnit.DAYS);
// 9.返回loginvo對象
LoginVo loginVo = new LoginVo();
loginVo.setToken(token);
return loginVo;
}到此這篇關(guān)于SpringBoot+Hutool實現(xiàn)圖片驗證碼的示例代碼的文章就介紹到這了,更多相關(guān)SpringBoot Hutool圖片驗證碼內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringMVC使用MultipartFile實現(xiàn)文件上傳
這篇文章主要為大家詳細介紹了SpringMVC使用MultipartFile實現(xiàn)文件上傳功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-04-04
springboot整合shiro之thymeleaf使用shiro標簽的方法
Thymeleaf 是一個跟 Velocity、FreeMarker 類似的模板引擎,它可以完全替代 JSP ,這篇文章主要介紹了springboot整合shiro之thymeleaf使用shiro標簽的相關(guān)知識,需要的朋友可以參考下2021-10-10
Spring學習筆記3之消息隊列(rabbitmq)發(fā)送郵件功能
這篇文章主要介紹了Spring學習筆記3之消息隊列(rabbitmq)發(fā)送郵件功能的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-07-07
教你在一分鐘之內(nèi)理解Java Lambda表達式并學會使用
今天給大家?guī)У奈恼率荍ava8新特性的相關(guān)知識,文章圍繞著如何在一分鐘之內(nèi)理解Java Lambda表達式并學會使用展開,文中有非常詳細的介紹,需要的朋友可以參考下2021-06-06
SpringBoot使用Jasypt對配置文件和數(shù)據(jù)庫密碼加密
在做數(shù)據(jù)庫敏感信息保護時,應(yīng)加密存儲,本文就來介紹一下SpringBoot使用Jasypt對配置文件和數(shù)據(jù)庫密碼加密,具有一定的參考價值,感興趣的可以了解一下2024-02-02

