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

利用hutool工具类实现验证码功能

hutool工具类实现验证码

  • 一.生成验证码
  • 二.校验验证码
  • 三.使用案例
    • 1.引入hutool工具类
    • 2.VerifyCodeResp接口响应体
    • 3.VerifyCodeController验证码工具类
    • 4.测试验证
    • 5.项目结构及源码下载

利用hutool工具类,可以很方便生成不同类型的验证码。这里简单记录下使用过程。

一.生成验证码

提供接口将生成的验证码存入session或redis,将验证码以图片格式或者base64编码串返回给调用端。

二.校验验证码

提供接口将收到调用端传过来的校验码,从session或redis取出验证码,两个验证码都全部转小写,进行无大小写区分匹配校验,返回true/flase 。

三.使用案例

1.引入hutool工具类

        <!-- hutool工具类 --><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.7.12</version></dependency>

2.VerifyCodeResp接口响应体

@Data
public class VerifyCodeResp implements Serializable {/*** header头参数:Captcha-Key*/private String captchaKey;/*** 验证码图片*/private String captchaImg;
}

3.VerifyCodeController验证码工具类

/*** 验证码工具类*/
@RestController
public class VerifyCodeController {@ResourceRedisTemplate<String, String> redisTemplate;/*** 生成验证码** 方法一 ShearCaptcha* 图片格式* session存储* 接口需添加白名单放行** @param request HttpServletRequest*/@GetMapping("/verify")public void verify(HttpServletRequest request, HttpServletResponse response) throws IOException {response.setContentType("image/jpeg");response.setHeader("Pragma", "no-cache");response.setHeader("Cache-Control", "no-cache");response.setDateHeader("Expires", 0);//定义图形验证码的长、宽、验证码字符数、干扰线宽度ShearCaptcha shearCaptcha = CaptchaUtil.createShearCaptcha(150, 40, 5, 4);//图形验证码写出,可以写出到文件,也可以写出到流shearCaptcha.write(response.getOutputStream());//获取验证码中的文字内容request.getSession().setAttribute("verifyCode", shearCaptcha.getCode());}/*** 生成验证码** 方法二 LineCaptcha* 图片格式* session存储* 接口需添加白名单放行** @param request HttpServletRequest*/@GetMapping("/verifyTwo")public void verifyTwo(HttpServletRequest request, HttpServletResponse response) throws IOException {response.setContentType("image/jpeg");response.setHeader("Pragma", "no-cache");response.setHeader("Cache-Control", "no-cache");response.setDateHeader("Expires", 0);//定义图形验证码的长、宽、验证码字符数、干扰线宽度LineCaptcha lineCaptcha = CaptchaUtil.createLineCaptcha(150, 40, 5, 4);//图形验证码写出,可以写出到文件,也可以写出到流ImageIO.write(lineCaptcha.getImage(), "JPEG", response.getOutputStream());//获取验证码中的文字内容request.getSession().setAttribute("verifyCode", lineCaptcha.getCode());}/*** 方法三 ShearCaptcha* 图片的base64编码字符串* session存储* 接口需添加白名单放行** @param request HttpServletRequest* @return String*/@GetMapping("/getVerify")public String getVerify(HttpServletRequest request) {//定义图形验证码的长、宽、验证码字符数、干扰线宽度ShearCaptcha shearCaptcha = CaptchaUtil.createShearCaptcha(150, 40, 5, 4);//获取验证码中的文字内容request.getSession().setAttribute("verifyCode", shearCaptcha.getCode());String base64String = "";try {base64String = "data:image/png;base64," + shearCaptcha.getImageBase64();} catch (Exception e) {e.printStackTrace();}return base64String;}/*** 方法四 LineCaptcha* 图片的base64编码字符串* session存储* 接口需添加白名单放行** @param request HttpServletRequest* @return String*/@GetMapping("/getVerifyTwo")public String getVerifyTwo(HttpServletRequest request) {//定义图形验证码的长、宽、验证码字符数、干扰线宽度LineCaptcha lineCaptcha = CaptchaUtil.createLineCaptcha(150, 40, 5, 4);//获取验证码中的文字内容request.getSession().setAttribute("verifyCode", lineCaptcha.getCode());String base64String = "";try {//返回 base64ByteArrayOutputStream bos = new ByteArrayOutputStream();ImageIO.write(lineCaptcha.getImage(), "JPEG", bos);byte[] bytes = bos.toByteArray();Base64.Encoder encoder = Base64.getEncoder();base64String = "data:image/png;base64," + encoder.encodeToString(bytes);} catch (Exception e) {e.printStackTrace();}return base64String;}/*** 方法五 ShearCaptcha* 图片的base64编码字符串* redis存储* 接口需添加白名单放行** @return String*/@GetMapping("/getVerifyThree")public VerifyCodeResp getVerifyThree() {String captchaKey = UUID.randomUUID().toString();//定义图形验证码的长、宽、验证码字符数、干扰线宽度ShearCaptcha shearCaptcha = CaptchaUtil.createShearCaptcha(150, 40, 5, 0);// 存入redis并设置过期时间为30分钟redisTemplate.opsForValue().set("captcha:" + captchaKey, shearCaptcha.getCode(), 30L, TimeUnit.MINUTES);String base64String = "";try {base64String = "data:image/png;base64," + shearCaptcha.getImageBase64();} catch (Exception e) {e.printStackTrace();}VerifyCodeResp verifyCodeResp = new VerifyCodeResp();verifyCodeResp.setCaptchaKey(captchaKey);verifyCodeResp.setCaptchaImg(base64String);return verifyCodeResp;}/*** 方法六 LineCaptcha* 图片的base64编码字符串* redis存储* 接口需添加白名单放行** @return String*/@GetMapping("/getVerifyFour")public VerifyCodeResp getVerifyFour() {String captchaKey = UUID.randomUUID().toString();//定义图形验证码的长、宽、验证码字符数、干扰线宽度LineCaptcha lineCaptcha = CaptchaUtil.createLineCaptcha(150, 40, 5, 4);// 存入redis并设置过期时间为30分钟redisTemplate.opsForValue().set("captcha:" + captchaKey, lineCaptcha.getCode(), 30L, TimeUnit.MINUTES);String base64String = "";try {//返回 base64ByteArrayOutputStream bos = new ByteArrayOutputStream();ImageIO.write(lineCaptcha.getImage(), "JPEG", bos);byte[] bytes = bos.toByteArray();Base64.Encoder encoder = Base64.getEncoder();base64String = "data:image/png;base64," + encoder.encodeToString(bytes);} catch (Exception e) {e.printStackTrace();}VerifyCodeResp verifyCodeResp = new VerifyCodeResp();verifyCodeResp.setCaptchaKey(captchaKey);verifyCodeResp.setCaptchaImg(base64String);return verifyCodeResp;}
}

4.测试验证

如果测试验证码存入redis,则需要提前配置和启动redis。
在这里插入图片描述
在这里插入图片描述

5.项目结构及源码下载

在这里插入图片描述
下载地址 springboot-cacheable 欢迎star哦~

http://www.lryc.cn/news/170233.html

相关文章:

  • 前端面试题: 请解释什么是函数的作用域?
  • 华为云云服务器云耀L实例评测 | 华为云云服务器实例新品全面解析
  • Nginx配置SSL证书
  • 一,安卓aosp源码编译环境搭建
  • video 视频编解码一些debug方法
  • 中秋国庆假期——模板推荐
  • 【配代码演示】Cookie和Session的区别
  • 【Linux初阶】信号入门2 | 信号阻塞、捕捉、保存
  • 【已解决】:该该虚拟机似乎正在使用中。如果该虚拟机未在使用,请按“获取所有权(T)“按钮获取它的所有权。否则,请按“取消(C)“按钮以防损坏。
  • 系统架构常用的工具
  • 腾讯云2核4G服务器5M带宽 218元一年 优惠价格明细表
  • [C++ 网络协议] 多播与广播
  • IOS17正式版今日发布
  • 2560. 打家劫舍 IV
  • java web中部署log4j.xml
  • 【张兔兔送书第一期:考研必备书单】
  • 基于Spring Boot+ Vue的健身房管理系统与实现
  • ThreadLocal线程局部变量
  • C++ Primer (第五版)第一章习题部分答案
  • Python与GUI集成:零基础也能开发国际象棋游戏
  • SaaS软件能保证数据安全吗?
  • 方案:基于AI烟火识别与视频技术的秸秆焚烧智能化监控预警方案
  • phantomjs插件---实现通过链接生成网页截图
  • SpringBoot分页实现查询数据
  • Jetson Xavier NX 与飞控(Pixhawk 4 Mini)实现串口通信
  • 为什么2022年秋招嵌入式开发岗位薪资大涨?
  • 在HTML里,attribute和property有什么区别?
  • 机器学习入门与实践:从原理到代码
  • SpringCloud在idea中一键启动项目
  • VB过程的递归调用,辗转相除法求最大公约数