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

SpringBoot版本

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

引入依赖

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

<!--验证码-->
<dependency><groupId>com.github.whvcse</groupId><artifactId>easy-captcha</artifactId><version>1.6.2</version>
</dependency>

实现思路

  • 把生成的验证码结果保存到redis缓存中,并设置过期时间。
  • 前端通过提交验证码和key,其中key就是保存到redis中的键,通过这个键获取到对应的值,再与前端提交的值对比,相同就通过验证。

实现过程

新建验证码枚举类

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

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

定义验证码配置信息

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

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

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

定义验证逻辑生成类

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

在控制层上定义验证码生成接口

@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+Vue)-基础的权限管理系统

    前后端分离(SpringBoot+Vue)-基础的权限管理系统 简介 前端项目代码地址:前端代码 后端项目代码地址:后端代码 最后的附录记录了自己在开发过程遇到问题及实现.部分文件的介绍 采用前后端分 ...

  2. 笔记合并_.NET Core开发实战(第23课:静态文件中间件:前后端分离开发合并部署骚操作)学习笔记(上)...

    23 | 静态文件中间件:前后端分离开发合并部署骚操作 我们先来看一下静态文件中间件有哪些能力 1.支持指定相对路径 2.支持目录的浏览 3.支持设置默认文档 4.支持多目录映射 源码链接: http ...

  3. .NET Core开发实战(第23课:静态文件中间件:前后端分离开发合并部署骚操作)--学习笔记(下)...

    23 | 静态文件中间件:前后端分离开发合并部署骚操作 这里还有一个比较特殊的用法 一般情况下,我们前后端分离的架构,前端会编译成一个 index.html 文件和若干个 CSS 文件和 JavaSc ...

  4. .NET Core开发实战(第23课:静态文件中间件:前后端分离开发合并部署骚操作)--学习笔记(上)...

    23 | 静态文件中间件:前后端分离开发合并部署骚操作 我们先来看一下静态文件中间件有哪些能力 1.支持指定相对路径 2.支持目录的浏览 3.支持设置默认文档 4.支持多目录映射 源码链接: http ...

  5. 网易音乐网站系统|前后端分离springboot+vue实现在线音乐网站

    作者主页:编程千纸鹤 作者简介:Java.前端.Python开发多年,做过高程,项目经理,架构师 主要内容:Java项目开发.毕业设计开发.面试技术整理.最新技术分享 收藏点赞不迷路  关注作者有好处 ...

  6. 前后端分离 springboot shiro+jwt token认证 权限校验

    项目源码 国涛/springboot-shiro-jwthttps://gitee.com/dugt/springboot-shiro-jwt GitHub - dugt-1998/springboo ...

  7. 前后端分离:vue项目部署服务器操作步骤详细

    部署前端项目vue到服务器 首对应的是找到项目 进入对应的目录下 进行 npm run build 会生成一个dist文件 将整个dist文件上传到服务器就可以了 然后就是首先就是安装node.js ...

  8. 前后端分离springboot+vue社区志愿者招募管理系统idea

    社区志愿者招募管理系统采用Spring.SpringMVC和MyBatis作为主体框架,系统设计遵循界面层.业务逻辑层和数据访问层的Web开发三层架构.采用B/S结构,使得系统更加容易维护.社区志愿者 ...

  9. 疫苗预约|疫苗管理|前后端分离Springboot+Vue儿童疫苗预约系统

    作者主页:编程指南针 作者简介:Java领域优质创作者.CSDN博客专家 .掘金特邀作者.多年架构师设计经验.腾讯课堂常驻讲师 主要内容:Java项目.毕业设计.简历模板.学习资料.面试题库.技术互助 ...

  10. 若依前后端分离框架——生成数字验证码功能源码学习

    使用版本:Ruo-Vue 3.8.0 项目地址:https://gitee.com/y_project/RuoYi-Vue 0.1:验证码生成流程图 0.2:验证码生成时序图 0.3:验证码的配置项 ...

最新文章

  1. C#调用存储过程简单完整例子
  2. mysql一: 登陆
  3. 怎样在PHP中通过ADO调用Asscess数据库和COM程序
  4. 灰度值取值范围_第三章 灰度变换与空间滤波-(三)直方图之直方图均衡
  5. bootstrap搜索框_Bootstrap 开源 SVG 图标库 Bootstrap Icons
  6. JS设置弹出小窗口。
  7. 模式实例之——中介者实例
  8. 如何在 Mac 上映射网络驱动器
  9. 计算机 控制面板都打不开怎么办,控制面板打不开怎么办?控制面板打开办法大全...
  10. 4块硬盘掉线导致服务器崩溃解决过程
  11. [北京活动]Ruby网站架构案例分享──财帮子FreeWheel(10.19 北京)
  12. java泡妞代码_java泡妞小程序
  13. JavaScript通过下标获取对象(字典)指定键和值
  14. LaTeX中插入两个并排的图片
  15. 自定义消息通知、手机震动、提示音
  16. 华为为LG Uplus提供10万个NB-IoT芯片和模块
  17. 编译器O2优化下,分块矩阵乘法的TLB分析猜想
  18. clickhouse.except.ClickHouseUnknownException异常
  19. 酷瓜云课堂(腾讯云版)v1.2.7 发布 - 钉钉机器人群通知
  20. 写在开始wphone开发前

热门文章

  1. python实时检测键盘输入函数
  2. 搭建springboot+mybatis+freemarker项目
  3. 2022年京东平台休闲食品的年度总销量超6亿件,同比增长6.5%
  4. XMind2020安装教程
  5. 远程手机教学|简单实用,1键远程协助老人使用智能手机
  6. linux 直流电机驱动设计,嵌入式Linux直流电机驱动.PPT
  7. app开发外包公司一般报价多少钱?
  8. 字符串的练习 统计字符串中大写,小写,数字的个数 29
  9. 华为运营商级路由器配置示例 | 公网IPv6 over SRv6 TE Policy
  10. python 批量处理图片