做网站哪家好公司,网站建设 宜宾,wordpress支持哪些数据库,专门做行测题的网站图片验证码在注册、登录、交易、交互等各类场景中都发挥着巨大作用#xff0c;能够防止操作者利用机器进行暴力破解、恶意注册、滥用服务、批量化操作和自动发布等行为。 创建一个实体类封装#xff0c;给前端返回的验证码数据#xff1a;
Data
public class ValidateCodeV…图片验证码在注册、登录、交易、交互等各类场景中都发挥着巨大作用能够防止操作者利用机器进行暴力破解、恶意注册、滥用服务、批量化操作和自动发布等行为。 创建一个实体类封装给前端返回的验证码数据
Data
public class ValidateCodeVo {private String codeKey ; // 验证码的keyprivate String codeValue ; // 图片验证码对应的字符串数据}业务层代码实现
public interface ValidateCodeService {// 获取验证码图片public abstract ValidateCodeVo generateValidateCode();}Service
public class ValidateCodeServiceImpl implements ValidateCodeService {
Autowiredprivate RedisTemplateString , String redisTemplate ;
Overridepublic ValidateCodeVo generateValidateCode() {
// 使用hutool工具包中的工具类生成图片验证码//参数宽 高 验证码位数 干扰线数量CircleCaptcha circleCaptcha CaptchaUtil.createCircleCaptcha(150, 48, 4, 20);String codeValue circleCaptcha.getCode();String imageBase64 circleCaptcha.getImageBase64();
// 生成uuid作为图片验证码的keyString codeKey UUID.randomUUID().toString().replace(-, );
// 将验证码存储到Redis中redisTemplate.opsForValue().set(user:login:validatecode: codeKey , codeValue , 5 , TimeUnit.MINUTES);
// 构建响应结果数据ValidateCodeVo validateCodeVo new ValidateCodeVo() ;validateCodeVo.setCodeKey(codeKey);validateCodeVo.setCodeValue(data:image/png;base64, imageBase64);
// 返回数据return validateCodeVo;}
}在Controller中添加获取验证码接口方法
Autowired
private ValidateCodeService validateCodeService;GetMapping(value /generateValidateCode)
public ResultValidateCodeVo generateValidateCode() {ValidateCodeVo validateCodeVo validateCodeService.generateValidateCode();return Result.build(validateCodeVo , ResultCodeEnum.SUCCESS) ;
}在登录的业务层实现验证码校验 /*** 用户登录* param loginDto* return*/Overridepublic LoginVo login(LoginDto loginDto) {//获取输入的验证码和存储到redis的key名称String captcha loginDto.getCaptcha();String key loginDto.getCodeKey();//根据获取的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.根据用户名查询用户表SysUser sysUser sysUserMapper.selectUserInfoByUserName(userName);// 3.如果根据用户名查不到对应的信息用户不存在返回错误信息if(sysUser null){//throw new RuntimeException(用户名不存在);throw new GuiguException(ResultCodeEnum.LOGIN_ERROR);}// 4.根据用户名查询用户信息用户存在// 5.获取输入的密码比较输入的密码和数据库的密码是否一致String database_assword sysUser.getPassword();// 把输入的密码进行加密 再比较数据库的密码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.登陆成功生产用户的唯一标识tokenString token UUID.randomUUID().toString().replaceAll(-, );// 8.把登陆成功的用户信息放到redis里面// key:token value:用户信息redisTemplate.opsForValue().set(user:logintoken,JSON.toJSONString(sysUser),7, TimeUnit.DAYS);// 9.返回loginvo对象LoginVo loginVo new LoginVo();loginVo.setToken(token);return loginVo;}