springbooot使用google验证码的功能实现

 更新时间:2023年05月04日 08:49:37   作者:张场长  
这篇文章主要介绍了springbooot使用google验证码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

springbooot使用google验证码

1、使用场景

由于需要做一个前后端分离的项目,想着使用google验证码,由于年龄大了,这些知识啊,用完就忘,在这里记录一下。

登录时验证码设计

  • 使用google验证码工具,当前端在登录请求时,在后端生成验证码,同时也生成一个随机数(UUID)与该验证码对应。
  • 使用redis作为缓存,将该随机数和验证码存储在redis中。
  • 随机数的目的是将验证码与发起登录请求的用户联系起来。
  • 当用户提交登录表单时,后端根据该随机数从redis中读取验证码与用户输入的验证码进行验证。

大概就是这样的一个设计思路,具体如下:

在这里插入图片描述

2、springboot使用google验证码

1、引入依赖

首先在pom文件中引入该验证码插件kaptcha

 <!-- google 验证码 -->
        <!-- https://mvnrepository.com/artifact/com.github.penggle/kaptcha -->
        <dependency>
            <groupId>com.github.penggle</groupId>
            <artifactId>kaptcha</artifactId>
            <version>2.3.2</version>
        </dependency>

2、编写配置类

引入依赖之后还需要编写配置类,在配置类里设置自己想要的验证码样式,包括颜色、大小、宽高等等。

我的配置类如下:

import com.google.code.kaptcha.impl.DefaultKaptcha;
import com.google.code.kaptcha.util.Config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.Properties;
@Configuration
public class KaptchaConfig {
       @Bean
    DefaultKaptcha producer() { //验证码的配置类
        Properties properties = new Properties();                       
        properties.put("kaptcha.border", "no");                       //边框
        properties.put("kaptcha.textproducer.font.color", "black");   //字体颜色
        properties.put("kaptcha.textproducer.char.space", "5");       //字体间隔
        properties.put("kaptcha.image.height", "40");                 //图片高度
        properties.put("kaptcha.image.width", "100");                 //图片宽度
        properties.put("kaptcha.textproducer.font.size", "30");       //字体大小
        Config config = new Config(properties);                       
        DefaultKaptcha defaultKaptcha = new DefaultKaptcha();         
        defaultKaptcha.setConfig(config);
        return defaultKaptcha;
    }
}

3、编写控制层

将下面的代码放到需要使用验证码的controller中

//获取登录验证码
    @GetMapping("/captcha")
    public Result Captcha() throws IOException {
        String key = UUID.randomUUID().toString();
        String code = producer.createText();
        BufferedImage image = producer.createImage(code);
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        ImageIO.write(image, "jpg", outputStream);
        BASE64Encoder encoder = new BASE64Encoder();
        String str = "data:image/jpeg;base64,";
        String base64Img = str + encoder.encode(outputStream.toByteArray());
        redisUtils.hset(Constants.CAPTCHA_KEY, key, code, 120);
        return Result.succ(
                MapUtil.builder()
                        .put("userKey", key)
                        .put("captchaImg", base64Img)
                        .build()
        );
    }

上面用到了封装的redis工具类redisUtils中的hset方法,并设置了验证码过期时间120秒。
hset方法如下:

/**
     * 向一张hash表中放入数据,如果不存在将创建
     *
     * @param key   键
     * @param item  项
     * @param value 值
     * @param time  时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间
     * @return true 成功 false失败
     */
    public boolean hset(String key, String item, Object value, long time) {
        try {
            redisTemplate.opsForHash().put(key, item, value);
            if (time > 0) {
                expire(key, time);
            }
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

Result是编写的统一结果返回类,代码如下所示:

@Data
public class Result_ implements Serializable {
    private int code;
    private String msg;
    private Object data;
    public static Result_ succ(Object data) {
        return succ(200, "操作成功", data);
    }
    public static Result_ fail(String msg) {
        return fail(400, msg, null);
    }
    public static Result_ succ (int code, String msg, Object data) {
        Result_ result = new Result_();
        result.setCode(code);
        result.setMsg(msg);
        result.setData(data);
        return result;
    }
    public static Result_ fail (int code, String msg, Object data) {
        Result_ result = new Result_();
        result.setCode(code);
        result.setMsg(msg);
        result.setData(data);
        return result;
    }
}

这里没有编写对于验证码的验证。

4、前端实现

验证码输入框代码如下:

<el-form-item label="验证码" prop="code" style="width: 380px">
                          <el-input placeholder="请输入验证码"v-model="loginForm.code"style="width: 172px; float: left" ></el-input>
                          <el-image class="captchaImg" :src="captchaImg" @click="getCaptcha()"></el-image>
                      </el-form-item>

验证码函数如下:

// 获取验证码
        getCaptcha() {
            this.$axios.get('/user/captcha1').then(res => {
                this.loginForm.token = res.data.data.token
                this.captchaImg = res.data.data.captchaImg
                this.loginForm.code = ''
            })
        }

到此这篇关于springbooot使用google验证码的文章就介绍到这了,更多相关springbooot google验证码内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot基于RabbitMQ实现消息延迟队列方案及使用场景

    SpringBoot基于RabbitMQ实现消息延迟队列方案及使用场景

    在很多的业务场景中,延时队列可以实现很多功能,此类业务中,一般上是非实时的,需要延迟处理的,需要进行重试补偿的,这篇文章主要介绍了SpringBoot基于RabbitMQ实现消息延迟队列方案及使用场景,需要的朋友可以参考下
    2024-04-04
  • Maven的安装+配置本地仓库路径方式

    Maven的安装+配置本地仓库路径方式

    这篇文章主要介绍了Maven的安装+配置本地仓库路径方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-09-09
  • JavaWeb Servlet实现文件上传与下载功能实例

    JavaWeb Servlet实现文件上传与下载功能实例

    因自己负责的项目中需要实现文件上传,所以下面下面这篇文章主要给大家介绍了关于JavaWeb Servlet实现文件上传与下载功能的相关资料,需要的朋友可以参考下
    2022-04-04
  • java使用socket实现一个多线程web服务器的方法

    java使用socket实现一个多线程web服务器的方法

    今天小编就为大家分享一篇java使用socket实现一个多线程web服务器的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-10-10
  • Java中的SPI机制使用解析

    Java中的SPI机制使用解析

    这篇文章主要介绍了Java中的SPI机制使用解析,SPI意思是"服务提供者的接口",专门提供给服务提供者或者扩展框架功能的开发者去使用的接口,SPI 将服务接口和服务实现分离开来,将服务调用方和服务实现方进行解耦,需要的朋友可以参考下
    2023-10-10
  • Kotlin实现静态方法

    Kotlin实现静态方法

    这篇文章主要介绍了Kotlin实现静态方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • mybatis-plus-boot-starter包与mybatis-plus-generator的冲突解决

    mybatis-plus-boot-starter包与mybatis-plus-generator的冲突解决

    本文主要介绍了mybatis-plus-boot-starter包与mybatis-plus-generator的冲突解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-10-10
  • java中创建两表之间的触发器详解

    java中创建两表之间的触发器详解

    这篇文章主要介绍了java中创建两表之间的触发器详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-06-06
  • 解决SpringBoot整合MybatisPlus分模块管理遇到的bug

    解决SpringBoot整合MybatisPlus分模块管理遇到的bug

    这篇文章主要介绍了解决SpringBoot整合MybatisPlus分模块管理遇到的bug,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • java学生信息管理系统设计

    java学生信息管理系统设计

    这篇文章主要为大家详细介绍了java学生信息管理系统设计,学生信息添加进入数据库的事务,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-11-11

最新评论