SpringBoot+Hutool實現(xiàn)圖片驗證碼的示例代碼
圖片驗證碼在注冊、登錄、交易、交互等各類場景中都發(fā)揮著巨大作用,能夠防止操作者利用機器進行暴力破解、惡意注冊、濫用服務、批量化操作和自動發(fā)布等行為。
創(chuàng)建一個實體類封裝,給前端返回的驗證碼數(shù)據(jù):
@Data public class ValidateCodeVo { private String codeKey ; // 驗證碼的key private String codeValue ; // 圖片驗證碼對應的字符串數(shù)據(jù) }
業(yè)務層代碼實現(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); ? // 構建響應結果數(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è)務層實現(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ù)用戶名查不到對應的信息,用戶不存在,返回錯誤信息 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; }
到此這篇關于SpringBoot+Hutool實現(xiàn)圖片驗證碼的示例代碼的文章就介紹到這了,更多相關SpringBoot Hutool圖片驗證碼內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
SpringMVC使用MultipartFile實現(xiàn)文件上傳
這篇文章主要為大家詳細介紹了SpringMVC使用MultipartFile實現(xiàn)文件上傳功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-04-04springboot整合shiro之thymeleaf使用shiro標簽的方法
Thymeleaf 是一個跟 Velocity、FreeMarker 類似的模板引擎,它可以完全替代 JSP ,這篇文章主要介紹了springboot整合shiro之thymeleaf使用shiro標簽的相關知識,需要的朋友可以參考下2021-10-10Spring學習筆記3之消息隊列(rabbitmq)發(fā)送郵件功能
這篇文章主要介紹了Spring學習筆記3之消息隊列(rabbitmq)發(fā)送郵件功能的相關資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-07-07SpringBoot使用Jasypt對配置文件和數(shù)據(jù)庫密碼加密
在做數(shù)據(jù)庫敏感信息保護時,應加密存儲,本文就來介紹一下SpringBoot使用Jasypt對配置文件和數(shù)據(jù)庫密碼加密,具有一定的參考價值,感興趣的可以了解一下2024-02-02