当前位置: 首页 > news >正文

springboot生成、响应图片验证码

我们平时经常会碰见图片验证码,那么在springboot中我们该怎么实现呢

我们可以使用一款开源的验证码生成工具EasyCaptcha,其支持多种类型的验证码,例如gif、中文、算术等,并且简单易用,具体内容可参考其官方文档。

效果展示:

入门使用步骤 :

导入maven坐标:

<dependencies><dependency><groupId>com.github.whvcse</groupId><artifactId>easy-captcha</artifactId><version>1.6.2</version></dependency>
</dependencies>

创建一个图像验证码类

(以字符串的形式把图片返回给前端,这里返回的不是图片URL,而是图片本身,通过使用base-64编码算法(算法功能:将任意二进制的内容编码成为一个字符串))

@Data
@Schema(description = "图像验证码")
@AllArgsConstructor
public class CaptchaVo {@Schema(description="验证码图片信息")private String image;@Schema(description="验证码key")private String key;
}

在controller类当中 

   @Operation(summary = "获取图形验证码")@GetMapping("login/captcha")public Result<CaptchaVo> getCaptcha() {CaptchaVo captchaVo = loginService.getCaptcha();return Result.ok(captchaVo);}

在实现类当中

 @Overridepublic CaptchaVo getCaptcha() {SpecCaptcha specCaptcha = new SpecCaptcha(130,48,4); //图片的宽、高、长度// 把redis中要保存的值统一转成小写String code = specCaptcha.text().toLowerCase();log.info("图片验证码为:"+code);// 生成唯一IDString key = RedisConstant.ADMIN_LOGIN_PREFIX + UUID.randomUUID().toString();ValueOperations opsForValue = redisTemplate.opsForValue();// 将验证码保存到redis当中(过期时间为60秒)opsForValue.set(key,code,RedisConstant.ADMIN_LOGIN_CAPTCHA_TTL_SEC,TimeUnit.SECONDS);return new CaptchaVo(specCaptcha.toBase64(),key);}

更多内容参考 官方文档。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 如果忘记了 Apple ID 密码,如何重设
  • SpinalHDL之spinal.core 组件(上篇)
  • 【软件测试】功能测试理论基础
  • httplib库:用C++11搭建轻量级HTTP服务器
  • PHP获取和操作配置文件php.ini的几个函数介绍
  • 【源码+文档+调试讲解】多媒体信息共享平台
  • 大型、复杂、逼真的安全服和安全帽检测:SFCHD数据集和SCALE方法
  • 内存泄漏之VLD可以检测哪些类型的内存泄漏?
  • 【人工智能】助力音乐产业
  • Android之内容提供者(ContentProvider)
  • 算法力扣刷题记录 八十三【96.不同的二叉搜索树】
  • 鼠标手势软件,效率办公必备!移动鼠标即可执行命令
  • 个人效能是一个系统
  • Redis 缓存预热、雪崩、穿透、击穿
  • 坐牢第二十七天(聊天室)
  • [NodeJS] 关于Buffer
  • 【Redis学习笔记】2018-06-28 redis命令源码学习1
  • Babel配置的不完全指南
  • es6
  • happypack两次报错的问题
  • javascript从右向左截取指定位数字符的3种方法
  • JavaScript类型识别
  • JavaWeb(学习笔记二)
  • Redis中的lru算法实现
  • uva 10370 Above Average
  • V4L2视频输入框架概述
  • 从setTimeout-setInterval看JS线程
  • 多线程 start 和 run 方法到底有什么区别?
  • 使用Envoy 作Sidecar Proxy的微服务模式-4.Prometheus的指标收集
  • 试着探索高并发下的系统架构面貌
  • media数据库操作,可以进行增删改查,实现回收站,隐私照片功能 SharedPreferences存储地址:
  • ​决定德拉瓦州地区版图的关键历史事件
  • ${ }的特别功能
  • (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上
  • (php伪随机数生成)[GWCTF 2019]枯燥的抽奖
  • (二)构建dubbo分布式平台-平台功能导图
  • (附源码)计算机毕业设计大学生兼职系统
  • (四) Graphivz 颜色选择
  • (转)甲方乙方——赵民谈找工作
  • (转)一些感悟
  • (自适应手机端)响应式新闻博客知识类pbootcms网站模板 自媒体运营博客网站源码下载
  • ***测试-HTTP方法
  • **CI中自动类加载的用法总结
  • ..thread“main“ com.fasterxml.jackson.databind.JsonMappingException: Jackson version is too old 2.3.1
  • .net core 管理用户机密
  • .Net Core 中间件验签
  • .NET IoC 容器(三)Autofac
  • .net refrector
  • .net8.0与halcon编程环境构建
  • .NET未来路在何方?
  • .NET序列化 serializable,反序列化
  • @SuppressLint(NewApi)和@TargetApi()的区别
  • [20181219]script使用小技巧.txt
  • [AI StoryDiffusion] 创造神奇故事,AI漫画大乱斗!
  • [Algorithm][动态规划][路径问题][不同路径][不同路径Ⅱ][珠宝的最高价值]详细讲解