SpringBoot+Hutool实现图片验证码的示例代码

 更新时间:2024年01月15日 10:02:38   作者:彭于晏689  
图片验证码在注册、登录、交易、交互等各类场景中都发挥着巨大作用,本文主要介绍了SpringBoot+Hutool实现图片验证码的示例代码,具有一定的参考价值,感兴趣的可以了解一下

图片验证码在注册、登录、交易、交互等各类场景中都发挥着巨大作用,能够防止操作者利用机器进行暴力破解、恶意注册、滥用服务、批量化操作和自动发布等行为。

在这里插入图片描述

创建一个实体类封装,给前端返回的验证码数据:

@Data
public class ValidateCodeVo {

    private String codeKey ;        // 验证码的key
    private String codeValue ;      // 图片验证码对应的字符串数据

}

业务层代码实现:

public interface ValidateCodeService {

    // 获取验证码图片
    public abstract ValidateCodeVo generateValidateCode();

}
@Service
public class ValidateCodeServiceImpl implements ValidateCodeService {
​
    @Autowired
    private RedisTemplate<String , String> redisTemplate ;
​
    @Override
    public ValidateCodeVo generateValidateCode() {
​
        // 使用hutool工具包中的工具类生成图片验证码
        //参数:宽  高  验证码位数 干扰线数量
        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);
​
        // 构建响应结果数据
        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 Result<ValidateCodeVo> generateValidateCode() {
    ValidateCodeVo validateCodeVo = validateCodeService.generateValidateCode();
    return Result.build(validateCodeVo , ResultCodeEnum.SUCCESS) ;
}

在登录的业务层实现验证码校验:

 /**
     * 用户登录
     * @param loginDto
     * @return
     */
    @Override
    public 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.登陆成功,生产用户的唯一标识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实现图片验证码的示例代码的文章就介绍到这了,更多相关SpringBoot Hutool图片验证码内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • 详解Java中AbstractMap抽象类

    详解Java中AbstractMap抽象类

    本篇文章给大家详细介绍了Java集合中的AbstractMap抽象类的相关用法以及知识点总结,需要的朋友参考下。
    2018-03-03
  • 解决java连接虚拟机Hbase无反应的问题

    解决java连接虚拟机Hbase无反应的问题

    这篇文章主要介绍了解决java连接虚拟机Hbase无反应的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • Java基本知识点之变量和数据类型

    Java基本知识点之变量和数据类型

    这篇文章主要给大家介绍了关于Java基本知识点之变量和数据类型的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • SpringMVC使用MultipartFile实现文件上传

    SpringMVC使用MultipartFile实现文件上传

    这篇文章主要为大家详细介绍了SpringMVC使用MultipartFile实现文件上传功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-04-04
  • SpringBoot如何解析参数的深入理解

    SpringBoot如何解析参数的深入理解

    这篇文章主要给大家介绍了关于SpringBoot是如何解析参数的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用SpringBoot具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-05-05
  • springboot整合shiro之thymeleaf使用shiro标签的方法

    springboot整合shiro之thymeleaf使用shiro标签的方法

    Thymeleaf 是一个跟 Velocity、FreeMarker 类似的模板引擎,它可以完全替代 JSP ,这篇文章主要介绍了springboot整合shiro之thymeleaf使用shiro标签的相关知识,需要的朋友可以参考下
    2021-10-10
  • Spring学习笔记3之消息队列(rabbitmq)发送邮件功能

    Spring学习笔记3之消息队列(rabbitmq)发送邮件功能

    这篇文章主要介绍了Spring学习笔记3之消息队列(rabbitmq)发送邮件功能的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-07-07
  • java之super关键字用法实例解析

    java之super关键字用法实例解析

    这篇文章主要介绍了java之super关键字用法实例解析,较为详细的分析了super关键字的用法及内存分布,需要的朋友可以参考下
    2014-09-09
  • 教你在一分钟之内理解Java Lambda表达式并学会使用

    教你在一分钟之内理解Java Lambda表达式并学会使用

    今天给大家带的文章是Java8新特性的相关知识,文章围绕着如何在一分钟之内理解Java Lambda表达式并学会使用展开,文中有非常详细的介绍,需要的朋友可以参考下
    2021-06-06
  • SpringBoot使用Jasypt对配置文件和数据库密码加密

    SpringBoot使用Jasypt对配置文件和数据库密码加密

    在做数据库敏感信息保护时,应加密存储,本文就来介绍一下SpringBoot使用Jasypt对配置文件和数据库密码加密,具有一定的参考价值,感兴趣的可以了解一下
    2024-02-02

最新评论