三分钟带你掌握Java开发图片验证码功能方法

 更新时间:2023年02月13日 08:33:13   作者:全村最野的狗  
这篇文章主要来为大家详细介绍Java实现开发图片验证码的具体方法,文中的示例代码讲解详细,具有一定的借鉴价值,需要的可以参考一下

基本流程

细分一共有7步。

  • 生成验证码:可以使用图形库生成一张随机验证码图片,然后将图片存储在服务器端。或者编码为base64方便传输。这里可以参考我的一篇文章,里面详细讲解了如何生成一张合格的验证码
  • 缓存验证码:验证码需要缓存在后端方便下次查询。
  • 返回验证码:将验证码和验证码唯一标识返回到前端。
  • 展示验证码:将验证码图片显示在登录页面:在登录页面中显示验证码图片,并请用户输入验证码。
  • 用户登录:获取用户输入:当用户提交登录表单时,获取用户输入的验证码并与服务器端存储的验证码通过进行比对。
  • 验证验证码:使用某种算法(如字符串比对),根据唯一标识对云端存储的验证码和用户输入的验证码进行比对。
  • 删除验证码:使用一次立即删除。

前端请求验证码

uuid是重点,将会贯穿整个验证码的生命周期。后端会根据uuid找到真实验证码进行比对。

getCode() {
      getCodeImg().then(res => {
        this.codeUrl = "data:image/gif;base64," + res.img;
        this.loginForm.uuid = res.uuid;
      });
    },

后端生成验证码

/**

●  生成验证码
*/
@GetMapping("/captchaImage")
public AjaxResult getCode(HttpServletResponse response) throws IOException{
    // 生成验证码信息
    String uuid = IdUtils.simpleUUID();
    String verifyKey = Constants.CAPTCHA_CODE_KEY + uuid;
    String capStr = null;
    BufferedImage image = null;
    // 生成验证码 可以配置多种类型的验证码
    if ("math".equals(captchaType)){
        capStr = captchaProducerMath.createText();
        image = captchaProducerMath.createImage(capText);
    }
    else if ("char".equals(captchaType)){
        capStr = captchaProducer.createText();
        image = captchaProducer.createImage(capStr);
    }
    // 存入redis
    redisCache.setCacheObject(verifyKey, code, Constants.CAPTCHA_EXPIRATION, TimeUnit.MINUTES);
    // 转换流信息写出
    FastByteArrayOutputStream os = new FastByteArrayOutputStream();
    try{
        ImageIO.write(image, "jpg", os);
    }
    catch (IOException e){
    	return AjaxResult.error(e.getMessage());
    }
    AjaxResult ajax = AjaxResult.success();
    ajax.put("uuid", uuid);
    // 转码base64
    ajax.put("img", Base64.encode(os.toByteArray()));
    return ajax;
} 

登录

带上 验证码 和 uuid 一起登录

password: "admin123"
username: "admin"
uuid: "66ae1f227bf245a8b6ec2e6c00fb6189"
code: "1234"

登录接口校验

先校验验证码,再校验账号密码。

@PostMapping("/login")
public AjaxResult login(@RequestBody  LoginBody loginBody) {
  AjaxResult ajax = AjaxResult.success();
  String token = loginService.login(loginBody.getUsername(), loginBody.getPassword(), loginBody.getCode(),
  loginBody.getUuid());
  ajax.put(Constants.TOKEN, token);
  return ajax;
}
/**
* 登录验证
*
* @param  username 用户名 
* @param  password 密码 
* @param  code 验证码 
* @param  uuid 唯一标识 
* @return  结果 
*/
public String login(String username, String password, String code, String uuid)
{
  String verifyKey = Constants.CAPTCHA_CODE_KEY + uuid;
  // 根据UUID 去redis取出正确的验证码======================================================
  String captcha = redisCache.getCacheObject(verifyKey);
  redisCache.deleteObject(verifyKey);
  // 验证redis的验证码和用户输入的验证码是否相等。
  // 验证账号密码
  // 验证错误就抛出异常
  
  // 生成token
  return tokenService.createToken(loginUser);
}

总结

这是一个简单的登录验证码实现流程,具体实现可能因技术栈和需求而有所不同。但是流程基本上都是相同的。

到此这篇关于三分钟带你掌握Java开发图片验证码功能方法的文章就介绍到这了,更多相关Java图片验证码内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Springboot整合MongoDB进行CRUD操作的两种方式(实例代码详解)

    Springboot整合MongoDB进行CRUD操作的两种方式(实例代码详解)

    这篇文章主要介绍了Springboot整合MongoDB进行CRUD操作的两种方式,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-04-04
  • springboot集成swagger过程解析

    springboot集成swagger过程解析

    这篇文章主要介绍了springboot集成swagger过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01
  • RabbitMQ,RocketMQ,Kafka 事务性,消息丢失,消息顺序性和消息重复发送的处理策略问题

    RabbitMQ,RocketMQ,Kafka 事务性,消息丢失,消息顺序性和消息重复发送的处理策略问题

    这篇文章主要介绍了RabbitMQ,RocketMQ,Kafka 事务性,消息丢失,消息顺序性和消息重复发送的处理策略,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03
  • 详解Mybatis内的mapper方法为何不能重载

    详解Mybatis内的mapper方法为何不能重载

    这篇文章主要介绍了详解Mybatis内的mapper方法为何不能重载,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • 解密Spring Boot深入理解条件装配与条件注解

    解密Spring Boot深入理解条件装配与条件注解

    条件注解是一种特殊的注解,用于标记在配置类、组件类或方法上,它们根据某些条件的结果来决定是否应用相应的配置或组件,这篇文章主要介绍了解密Spring Boot深入理解条件装配与条件注解,需要的朋友可以参考下
    2024-06-06
  • Springboot自定义banner及验证过程

    Springboot自定义banner及验证过程

    这篇文章主要介绍了Springboot自定义banner及验证过程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • Java8的EnumMap源码分析

    Java8的EnumMap源码分析

    这篇文章主要介绍了Java8的EnumMap源码分析,EnumMap 是一个用于存储 key 为枚举类型的 map,底层使用数组实现(K,V 双数组),与其他类型 map 不同的是 EnumMap 底层使用双数组来存储 key 与 value,key 数组会在构造函数中根据 keyType 进行初始化,需要的朋友可以参考下
    2023-11-11
  • Java框架篇:Spring+SpringMVC+hibernate整合开发

    Java框架篇:Spring+SpringMVC+hibernate整合开发

    本篇文章将会对Spring+SpringMVC+hibernate的整合开发进行介绍。具有很好的参考价值。下面跟着小编一起来看下吧
    2017-02-02
  • mybatis定义sql语句标签之delete标签解析

    mybatis定义sql语句标签之delete标签解析

    这篇文章主要介绍了mybatis定义sql语句标签之delete标签解析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • 避免sql注入_动力节点Java学院整理

    避免sql注入_动力节点Java学院整理

    这篇文章主要介绍了避免sql注入,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08

最新评论