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

1|0SpringBoot 版本

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

2|0 引入依赖

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

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

3|1 实现过程

新建验证码枚举类

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

// fhadmin.cn
public enum LoginCodeEnum {/*** 算数*/ARITHMETIC,/*** 中文*/CHINESE,/*** 中文闪图*/CHINESE_GIF,/*** 闪图*/GIF,SPEC
}

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

// 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 类的统一配置类

// fhadmin.cn
@Configuration
public class ConfigBeanConfiguration {@Bean@ConfigurationProperties(prefix = "login")public LoginProperties loginProperties() {return new LoginProperties();}
}

定义逻辑验证生成类

// 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);}@Overrideprotected 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();}}
}

控制层定义验证生成接口

// 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;}

前端调用接口

<template>
<div class="login-code"><img :src="codeUrl" @click="getCode">
</div>
</template>
<script>methods: {getCode() {getCodeImg().then(res => {this.codeUrl = res.data.imgthis.loginForm.uuid = res.data.uuid})},}created() {// 获取验证码this.getCode()},</script>

SpringBoot 前后端分离 实现验证码操作相关推荐

  1. springboot前后端分离后权限原理浅谈

    1. 需求描述 最近在梳理springboot前后端分离后的权限管理问题.前段时间,已经把shiro的实现和spring security 的实现进行了初步的了解.如果深入细节,一个篇幅怕是不够.本文 ...

  2. B站云E办Vue+SpringBoot前后端分离项目——MVC三层架构搭建后台项目

    本项目来源B站云E办,笔记整理了项目搭建的过程和涉及的知识点.对于学习来说,不是复制粘贴代码即可,要知其然知其所以然.希望我的笔记能为大家提供思路,也欢迎各位伙伴的指正. 项目前端学习笔记目录 B站云 ...

  3. SpringBoot后台管理+Uniapp(混合APP)前端 之 酒店住宿+景点下单管理系统(SpringBoot前后端分离)

    酒店住宿+景点下单管理系统(SpringBoot前后端分离) 之 SpringBoot后台管理+Uniapp(混合APP)前端 SpringBoot前后端分离项目-Thymeleaf模板引擎景区旅游管 ...

  4. 前后端分离实现验证码

    前后端分离实现验证码 实现流程 1.前端登录页面加载时发送请求来请求验证码接口 2.服务器端接收到用户验证码的请求之后,使用工具类来生成验证码(base64) 3.将获取到的 验证码 对应的code ...

  5. Android+SpringBoot前后端分离实现登录注册

    Android+SpringBoot前后端分离实现登录注册 一.登录 1.界面设计 2.Android端 (1)布局文件(activity_login) (2)java文件(LoginActivity ...

  6. 基于SpringBoot前后端分离的众筹系统(附源码)

    基于SpringBoot前后端分离的众筹系统源码下载链接: https://download.csdn.net/download/weixin_47367099/85441573 一.运行步骤 1.环 ...

  7. 新手摸爬滚打:vue+springboot前后端分离项目演示(三)——axios实现前后端交互

    导语:路漫漫其修远兮,吾将上下而求索 前篇: 新手摸爬滚打:vue+springboot前后端分离项目演示(一)--vue cli创建vue2项目 新手摸爬滚打:vue+springboot前后端分离 ...

  8. SpringBoot前后端分离项目中如何制作前端jar包(类似swaggerUI前端jar包制作方法)

    SpringBoot前后端分离项目中如何制作前端jar包(类似swaggerUI前端jar包制作方法) 可用于SpringBoot引用的前端UI的Jar包,类似于SwaggerUI包 WABJAR介绍 ...

  9. 基于vue springboot 前后端分离的电影院会员管理系统

    基于vue springboot 前后端分离的电影院会员管理系统 文章目录 基于vue springboot 前后端分离的电影院会员管理系统 前言 一.主要功能 二.运行截图 1.前端package. ...

最新文章

  1. 程序员自学到底有没有用?网友们吵翻了...
  2. GNUGK 作为Gatekeeper穿透防火墙和NAT
  3. 常用正则表达式汇总(数字匹配/字符匹配/特殊匹配)
  4. linux 安装 Elasticsearch6.4.0详细步骤以及问题解决方案
  5. corel产品注册样机安装代码_为你的产品创建一个高逼格的宣传片
  6. 半夜闲的真是蛋疼。。。决定写个小博文
  7. Java设计模式学习总结(14)——结构型模式之代理模式
  8. [Git]4.2 标签
  9. Android开发笔记(八十一)屏幕规格适配
  10. Unity3D跑马灯脚本
  11. 几大经典算法c语言cnds,浮点数据有损压缩算法 附完整C代码
  12. 泛微OA漏洞(综合)
  13. 几种“超强壮”的弱密码方案
  14. md5加密特征码java,讨论:加密算法特征码及其识别
  15. 上海通用北盛汽车2012届校园招聘长春理工大学专业面试安排 共 27 人
  16. linux下使用iptables NAT上网
  17. Golang 标准库 tips之waitgroup详解
  18. 【渝粤教育】广东开放大学 企业财务报表分析 形成性考核 (26)
  19. 杭电数据结构课程实践-重言式判别
  20. 《SLA by Short brain》—学好英语口语的终极法宝!

热门文章

  1. NCE3.21 Danile Mendoza 丹尼尔.门萨多 -句子成分分析
  2. 爬取电影《无双》影评数据,分析,可视化
  3. 第二章 软件项目确立
  4. 扁平化风格职业规划PPT模板
  5. PHP绘制99的棋盘,JS canvas绘制五子棋的棋盘
  6. 支付宝小程序模板行业合集,支付宝小程序制作平台分享
  7. 哪个软件测试手机电池续航好,6款手机电池续航测试排名:iPhone12mini险些垫底,第1名是小米10...
  8. Sdm660--OpenCamera流程详细分析(Camera1+Hal1)
  9. 微信第三方登录,主要手机没有安装微信处理
  10. 项目实战:Qt贝塞尔曲线拽托顶点实时显示工具