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验证码内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java对称加密算法DES实例详解

    Java对称加密算法DES实例详解

    这篇文章主要介绍了Java对称加密算法DES,结合实例形式详细分析了java DES算法的概念、原理、实现方法与应用场景,需要的朋友可以参考下
    2019-09-09
  • 详解spring mvc中url-pattern的写法

    详解spring mvc中url-pattern的写法

    这篇文章主要介绍了spring mvc中url-pattern的写法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-12-12
  • Mybatis框架之模板方法模式(Template Method Pattern)的实现

    Mybatis框架之模板方法模式(Template Method Pattern)的实现

    MyBatis中使用了模板方法模式来控制SQL语句的执行流程,本文主要介绍了Mybatis框架之模板方法模式(Template Method Pattern)的实现,需要的朋友们下面随着小编来一起学习学习吧
    2024-11-11
  • Flink部署集群整体架构源码分析

    Flink部署集群整体架构源码分析

    这篇文章主要为大家介绍了Flink部署集群及整体架构示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • Java后端配置允许跨域方式

    Java后端配置允许跨域方式

    本文介绍了在不同技术和框架中配置跨域资源共享(CORS)的方法,包括使用SpringMVC的@CrossOrigin注解、SpringBoot的全局CORS配置、SpringSecurity中的CORS集成以及手动设置响应头,根据具体需求和技术栈,选择合适的方法来确保跨域请求的安全性和有效性
    2025-02-02
  • Spring IOC原理详解

    Spring IOC原理详解

    这篇文章主要介绍了Spring IOC原理详解,具有一定借鉴价值,需要的朋友可以参考下。
    2017-12-12
  • java线程池核心API源码详细分析

    java线程池核心API源码详细分析

    大家好,本篇文章主要讲的是java线程池核心API源码详细分析,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2022-01-01
  • Spring Cloud Stream实现数据流处理

    Spring Cloud Stream实现数据流处理

    Spring Cloud Stream的核心是Stream,准确来讲Spring Cloud Stream提供了一整套数据流走向(流向)的API, 它的最终目的是使我们不关心数据的流入和写出,而只关心对数据的业务处理,本文给大家介绍了Spring Cloud Stream实现数据流处理,需要的朋友可以参考下
    2024-11-11
  • SpringBoot实现Word转PDF和TXT的实践分享

    SpringBoot实现Word转PDF和TXT的实践分享

    研发工作中难免会遇到一些奇奇怪怪的需求,就比如最近,客户提了个新需求:上传一个WORD文档,要求通过系统把该文档转换成PDF和TXT,所以本文给大家分享了SpringBoot实现Word转PDF和TXT的实践,感兴趣的朋友可以参考下
    2024-08-08
  • Servlet实现分页效果

    Servlet实现分页效果

    这篇文章主要为大家详细介绍了Servlet实现分页效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-03-03

最新评论