Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >SpringBoot 前后端分离 实现验证码操作

SpringBoot 前后端分离 实现验证码操作

原创
作者头像
FHAdmin
发布于 2022-05-24 02:40:00
发布于 2022-05-24 02:40:00
1.7K00
代码可运行
举报
文章被收录于专栏:FHADMINFHADMIN
运行总次数:0
代码可运行

验证码的功能是防止非法用户恶意去访问登录接口而设置的一个功能,今天我们就来看看在前后端分离的项目中,SpringBoot 是如何提供服务的。

1|0SpringBoot 版本

本文基于的 Spring Boot 的版本是 2.6.7 。

2|0 引入依赖

captcha 一款超简单的验证码生成,还挺好玩的。还有中文验证码,动态验证码. 。在项目中 pom.xml 配置文件中添加依赖,如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!--验证码-->
<dependency>
    <groupId>com.github.whvcse</groupId>
    <artifactId>easy-captcha</artifactId>
    <version>1.6.2</version>
</dependency>
  • 把生成的验证码结果保存到 redis 缓存中,并设置过期时间。
  • 前端通过提交验证码和 key,其中 key 就是保存到 redis 中的键,通过这个键获取到对应的值,再与前端提交的值对比,相同就通过验证。

3|1 实现过程

新建验证码枚举类

由于 captcha 这款验证码提供了好几种验证码方法,有中文验证码,动态验证码,算术验证码等等,新建一个验证码每周类存放这几种验证码类型。代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// fhadmin.cn
public enum LoginCodeEnum {
    /**
     * 算数
     */
    ARITHMETIC,
    /**
     * 中文
     */
    CHINESE,
    /**
     * 中文闪图
     */
    CHINESE_GIF,
    /**
     * 闪图
     */
    GIF,
    SPEC
}

该类是定义验证码的基本信息,例如高度、宽度、字体类型、验证码类型等等、并且我们把它转成通过 SpringBoot 配置文件类型来定义更加方便。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// fhadmin.cn
@Data
public class LoginCode {

    /**
     * 验证码配置
     */
    private LoginCodeEnum codeType;
    /**
     * 验证码有效期 分钟
     */
    private Long expiration = 2L;
    /**
     * 验证码内容长度
     */
    private int length = 2;
    /**
     * 验证码宽度
     */
    private int width = 111;
    /**
     * 验证码高度
     */
    private int height = 36;
    /**
     * 验证码字体
     */
    private String fontName;
    /**
     * 字体大小
     */
    private int fontSize = 25;

    /**
     * 验证码前缀
     * @return
     */
    private  String   codeKey;


    public LoginCodeEnum getCodeType() {
        return codeType;
    }
}

把配置文件转换 Pojo 类的统一配置类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// fhadmin.cn
@Configuration
public class ConfigBeanConfiguration {

    @Bean
    @ConfigurationProperties(prefix = "login")
    public LoginProperties loginProperties() {
        return new LoginProperties();
    }
}

定义逻辑验证生成类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// fhadmin.cn
@Data
public class LoginProperties {

    private LoginCode loginCode;


    /**
     * 获取验证码生产类
     * @return
     */
    public Captcha getCaptcha(){
        if(Objects.isNull(loginCode)){
            loginCode = new LoginCode();
            if(Objects.isNull(loginCode.getCodeType())){
                loginCode.setCodeType(LoginCodeEnum.ARITHMETIC);
            }

        }
        return switchCaptcha(loginCode);
    }

    /**
     * 依据配置信息生产验证码
     * @param loginCode
     * @return
     */
    private Captcha switchCaptcha(LoginCode loginCode){
        Captcha captcha = null;
        synchronized (this){
            switch (loginCode.getCodeType()){
                case ARITHMETIC:
                    captcha = new FixedArithmeticCaptcha(loginCode.getWidth(),loginCode.getHeight());
                    captcha.setLen(loginCode.getLength());
                    break;
                case CHINESE:
                    captcha = new ChineseCaptcha(loginCode.getWidth(),loginCode.getHeight());
                    captcha.setLen(loginCode.getLength());
                    break;
                case CHINESE_GIF:
                    captcha = new ChineseGifCaptcha(loginCode.getWidth(),loginCode.getHeight());
                    captcha.setLen(loginCode.getLength());
                    break;
                case GIF:
                    captcha = new GifCaptcha(loginCode.getWidth(),loginCode.getHeight());
                    captcha.setLen(loginCode.getLength());
                    break;
                case SPEC:
                    captcha = new SpecCaptcha(loginCode.getWidth(),loginCode.getHeight());
                    captcha.setLen(loginCode.getLength());
                default:
                    System.out.println("验证码配置信息错误!正确配置查看 LoginCodeEnum ");

            }
        }
        if(StringUtils.isNotBlank(loginCode.getFontName())){
            captcha.setFont(new Font(loginCode.getFontName(),Font.PLAIN,loginCode.getFontSize()));
        }
        return captcha;
    }

    static  class FixedArithmeticCaptcha extends ArithmeticCaptcha{
        public FixedArithmeticCaptcha(int width,int height){
            super(width,height);
        }

        @Override
        protected char[] alphas() {
            // 生成随机数字和运算符
            int n1 = num(1, 10), n2 = num(1, 10);
            int opt = num(3);

            // 计算结果
            int res = new int[]{n1 + n2, n1 - n2, n1 * n2}[opt];
            // 转换为字符运算符
            char optChar = "+-x".charAt(opt);

            this.setArithmeticString(String.format("%s%c%s=?", n1, optChar, n2));
            this.chars = String.valueOf(res);

            return chars.toCharArray();
        }
    }
}

控制层定义验证生成接口

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// fhadmin.cn   
@ApiOperation(value = "获取验证码", notes = "获取验证码")
    @GetMapping("/code")
    public Object getCode(){

        Captcha captcha = loginProperties.getCaptcha();
        String uuid = "code-key-"+IdUtil.simpleUUID();
        //当验证码类型为 arithmetic时且长度 >= 2 时,captcha.text()的结果有几率为浮点型
        String captchaValue = captcha.text();
        if(captcha.getCharType()-1 == LoginCodeEnum.ARITHMETIC.ordinal() && captchaValue.contains(".")){
            captchaValue = captchaValue.split("\\.")[0];
        }
        // 保存
        redisUtils.set(uuid,captchaValue,loginProperties.getLoginCode().getExpiration(), TimeUnit.MINUTES);
        // 验证码信息
        Map<String,Object> imgResult = new HashMap<String,Object>(2){{
            put("img",captcha.toBase64());
            put("uuid",uuid);
        }};
        return imgResult;

    }

前端调用接口

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<template>
<div class="login-code">
  <img :src="codeUrl" @click="getCode">
</div>
</template>
<script>
    methods: {
    getCode() {
      getCodeImg().then(res => {
        this.codeUrl = res.data.img
        this.loginForm.uuid = res.data.uuid
      })
    },
    }
    created() {
    // 获取验证码
    this.getCode()
  },
 </script>

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
SpringBoot3整合Hutool-captcha实现图形验证码
如果你想像Spring-Boot一样引入Hutool,再由子模块决定用到哪些模块,你可以在父模块中加入:
Harry技术
2025/01/13
1870
SpringBoot3整合Hutool-captcha实现图形验证码
Spring Boot 3 整合Hutool-captcha实现图形验证码
在整合技术框架的时候,想找一个图形验证码相关的框架,看到很多验证码不在更新了或者是在中央仓库下载不下来,还需要多引入依赖。后面看到了Hutool 图形验证码(Hutool-captcha)中对验证码的实现,提供了:线段干扰验证码、圆圈干扰验证码、扭曲干扰验证码以及自定义验证码。就此验证码在项目中的使用展开说明。
Harry技术
2025/01/12
4610
Spring Boot 3 整合Hutool-captcha实现图形验证码
【验证码】SpringBoot前后端分离验证码
本篇文章记录的是我目前正在用的一种思路,不一定合所有人胃口,但我觉得是很不错的一种思路;
无道
2020/06/22
5.1K2
验证码生成 EasyCaptcha
JavaWeb图形验证码,支持gif验证码,可用于基于的session的web项目和前后端分离的项目。 源码地址:https://gitee.com/jeesys/EasyCaptcha/
utopia
2023/03/20
1.2K0
验证码生成 EasyCaptcha
springbooot使用google验证码
由于需要做一个前后端分离的项目,想着使用google验证码,由于年龄大了,这些知识啊,用完就忘,在这里记录一下。
魚迹
2023/05/06
4450
springbooot使用google验证码
5分钟搞定 SpringBoot 图形验证码功能
用户登录几乎是一个线上系统必不可少且使用相对比较频繁的一个模块,为了防止恶意暴力尝试,防止洪水攻击、防止脚本自动提交等,验证码是一个较为便捷且行之有效的预防手段,下面使用三个简单的步骤轻松5分钟搞定一个图形验证码功能;
一行Java
2022/04/07
6.7K0
5分钟搞定 SpringBoot 图形验证码功能
登录验证码demo-java
在一些类似于管理系统的项目中,我们在登录时经常会用到图片验证码。这里把我自己写的一个小系统(后台是java语言)的验证码部分摘出来。 总体思路是后端有一个生成验证码图片的接口,把验证码图片写入浏览器,前端页面在img标签里的src属性里填写后端生成验证码图片的接口地址即可。 1、java部分-CaptchaController.java 我这里是把后端生成的验证码生成图片返回给浏览器时,同时存入到了数据库中,前端登录时,后端根据前端输入的验证码和数据库中的验证码作对比,来判断是否可以登录。 package
用户1174387
2018/01/17
3.3K0
登录验证码demo-java
Spring Boot 实现登录验证码有效时间
在现代 Web 应用中,为了提高安全性,登录过程中常常会引入验证码(CAPTCHA)以防止恶意的自动化攻击。然而,简单的验证码并不足够,为了进一步增强安全性,我们通常会为验证码设置有效时间,即验证码只能在生成后的某一段时间内使用,过期后需重新获取。在本文中,我们将以 Spring Boot 为例,详细讲解如何实现带有效时间的登录验证码系统。
繁依Fanyi
2024/09/21
2900
Springboot +redis+⾕歌开源Kaptcha实现图片验证码功能
用户7630333
2023/12/07
3150
Springboot +redis+⾕歌开源Kaptcha实现图片验证码功能
浅谈 前端验证码那些事
在实际项目的开发中,验证码的出现的频率相当高,它能实现人机甄别访问、减轻服务器负担的作用。常见的验证码为以下几类:
万少
2025/02/10
1570
浅谈 前端验证码那些事
【Spring】探秘 SpringBoot 配置文件:解锁验证码背后的实现逻辑
干扰项:圆形干扰,线性干扰,扭曲字体干扰,颜色色块干扰.....其实主要就是验证码号以及背景干扰项;(小编自己总结的)
用户11288949
2025/01/17
710
【Spring】探秘 SpringBoot 配置文件:解锁验证码背后的实现逻辑
Spring Security---验证码详解
验证码实际上和谜语有点像,分为谜面和谜底。谜面通常是图片,谜底通常为文字。谜面用于展现,谜底用于校验。
大忽悠爱学习
2021/12/07
1.1K0
Spring Security---验证码详解
Angular企业级开发(9)-前后端分离之后添加验证码
1.背景介绍 团队开发的项目,前端基于Bootstrap+AngularJS,后端Spring MVC以RESTful接口给前端调用。开发和部署都是前后端分离。项目简单部署图如下,因为后台同时采用微服
八哥
2018/01/18
1.8K0
Angular企业级开发(9)-前后端分离之后添加验证码
Java图形验证码支持gif、中文、算术等
图形验证码是最经典,也是最常用的验证方式。今天介绍一个非常不错的类库:Java图形验证码,支持gif、中文、算术等类型,可用于Java Web、JavaSE等项目。
BUG弄潮儿
2020/10/19
1K0
小小验证码,作用可真不小!
我们在开发用户登录功能的时候,总是会被要求加一个验证码的功能!那么,为什么要加这个验证码?验证码有什么作用?常见的验证码有哪些?
Java旅途
2020/08/04
4920
Node实现图形验证码
使用 svg-captcha 这个包并结合后端实现图形验证码功能。 项目地址:https://github.com/Ewall1106/mall 基本使用 在我们项目中安装 svg-captcha 包。 $ npm install svg-captcha --save 官方文档中的基本使用示例: const svgCaptcha = require('svg-captcha'); const captcha = svgCaptcha.create(); console.log(captcha);
Ewall
2020/11/12
1.5K0
java验证码识别--4
http://blog.csdn.net/problc/article/details/5794460
井九
2024/10/12
850
java验证码识别--4
Spring Security--短信验证码详解
在这一步我们需要写一个controller接收用户的获取验证码请求。注意:一定要为“/smscode”访问路径配置为permitAll访问权限,因为spring security默认拦截所有路径,除了默认配置的/login请求,只有经过登录认证过后的请求才会默认可以访问。
大忽悠爱学习
2021/12/07
1.6K0
Spring Security--短信验证码详解
java验证码识别--2
http://blog.csdn.net/problc/article/details/5794460
井九
2024/10/12
1070
java验证码识别--2
SpringBoot+Redis实现图形验证码
在实际生活中,我们经常会遇到在登陆的时候,需要输入图形验证码这样的场景,验证码不仅可以防止爬虫的抓取,还可以限制接口短时间内被访问的次数,可以说也是一种限流措施。本篇来学习如何在前后端分离架构下,基于SpringBoot实现图形验证码这一功能。
啃饼思录
2023/03/18
2.4K0
SpringBoot+Redis实现图形验证码
相关推荐
SpringBoot3整合Hutool-captcha实现图形验证码
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验