SpringBoot验证码之使用hutool-captcha方式实现验证码生成与验证

这篇具有很好参考价值的文章主要介绍了SpringBoot验证码之使用hutool-captcha方式实现验证码生成与验证。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

生成验证码
提供一个接口, 这个接口里,我们将生成的验证码存入session,然后将验证码以图片格式或者base64编码串返回给调用端。

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

1、pom文件中导入hutool-captcha依赖

<dependency>
        <groupId>cn.hutool</groupId>
        <artifactId>hutool-all</artifactId>
        <version>5.7.12</version>
</dependency>

2、创建后端控制类生成验证码
 创建控制类CommonController类,一方面通过流的方式将随机生成的验证码图片信息发送到前端浏览器;另一方面将验证码中的验证信息写入session中,以方便后续的验证。

import cn.hutool.captcha.CaptchaUtil;
import cn.hutool.captcha.LineCaptcha;

import cn.hutool.captcha.ShearCaptcha;
import VerifyCodeVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Base64;
import java.util.UUID;
import java.util.concurrent.TimeUnit;

/**
 * @author author
 */
@RestController
@Api(tags = "验证码工具类")
public class CommonController {
    @Resource
    RedisTemplate<String, String> redisTemplate;

    /**
     * 方法一 ShearCaptcha
     * 图片格式
     * session存储
     * 接口需添加白名单放行
     *
     * @param request HttpServletRequest
     */
    @GetMapping("/verify")
    @ApiOperation("生成验证码")
    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")
    @ApiOperation("生成验证码")
    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")
    @ApiOperation("生成验证码")
    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")
    @ApiOperation("生成验证码")
    public String getVerifyTwo(HttpServletRequest request) {
        //定义图形验证码的长、宽、验证码字符数、干扰线宽度
        LineCaptcha lineCaptcha = CaptchaUtil.createLineCaptcha(150, 40, 5, 4);
        //获取验证码中的文字内容
        request.getSession().setAttribute("verifyCode", lineCaptcha.getCode());
        String base64String = "";
        try {
            //返回 base64
            ByteArrayOutputStream 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")
    @ApiOperation("生成验证码")
    public VerifyCodeVO 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);
        //captcha:d6e561a6-7929-4469-8154-008710932f61
        String base64String = "";
        try {
            base64String = "data:image/png;base64," + shearCaptcha.getImageBase64();
        } catch (Exception e) {
            e.printStackTrace();
        }
        VerifyCodeVO verifyCodeVO = new VerifyCodeVO();
        verifyCodeVO.setCaptchaKey(captchaKey);
        verifyCodeVO.setCaptchaImg(base64String);
        return verifyCodeVO;
    }

    /**
     * 方法六 LineCaptcha
     * 图片的base64编码字符串
     * redis存储
     * 接口需添加白名单放行
     *
     * @return String
     */
    @GetMapping("/getVerifyFour")
    @ApiOperation("生成验证码")
    public VerifyCodeVO 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);
        //captcha:d6e561a6-7929-4469-8154-008710932f61
        String base64String = "";
        try {
            //返回 base64
            ByteArrayOutputStream 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();
        }
        VerifyCodeVO verifyCodeVO = new VerifyCodeVO();
        verifyCodeVO.setCaptchaKey(captchaKey);
        verifyCodeVO.setCaptchaImg(base64String);
        return verifyCodeVO;
    }
}

3、实现验证码的验证与返回结果
对前端输入的数据并发送到服务器的验证信息进行校验,当输入信息与验证码信息一致则返回true,否则返回false。

     /**
     * session存储
     *
     * @param captchaCode 验证码
     * @param request     HttpServletRequest
     * @return boolean
     */
    @GetMapping("/checkCaptcha")
    @ApiOperation("验证码校验")
    public boolean getCheckCaptcha(@RequestParam("captchaCode") String captchaCode, HttpServletRequest request) {
        try {
            // toLowerCase() 不区分大小写进行验证码校验
            String sessionCode = String.valueOf(request.getSession().getAttribute("verifyCode")).toLowerCase();
            System.out.println("session里的验证码:" + sessionCode);
            String receivedCode = captchaCode.toLowerCase();
            System.out.println("用户的验证码:" + receivedCode);
            return !"".equals(sessionCode) && !"".equals(receivedCode) && sessionCode.equals(receivedCode);
        } catch (Exception e) {
            return false;
        }
    }

    /**
     * redis存储
     *
     * @param captchaCode 验证码
     * @param request     HttpServletRequest
     * @return boolean
     */
    @GetMapping("/checkCaptchaTwo")
    @ApiOperation("验证码校验")
    @ApiImplicitParam(value = "Captcha-Key", name = "Captcha-Key", paramType = "header", dataType = "String", required = true)
    public boolean getCheckCaptchaTwo(@RequestParam("captchaCode") String captchaCode, HttpServletRequest request) {
        try {
            // toLowerCase() 不区分大小写进行验证码校验
            String redisCode = String.valueOf(redisTemplate.opsForValue().get("captcha:" + request.getHeader("Captcha-Key"))).toLowerCase();
            System.out.println("redisCode里的验证码:" + redisCode);
            String receivedCode = captchaCode.toLowerCase();
            System.out.println("用户的验证码:" + receivedCode);
            return !"".equals(redisCode) && !"".equals(receivedCode) && redisCode.equals(receivedCode);
        } catch (Exception e) {
            return false;
        }
    }

 Redis存储,返回工具类:

import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.io.Serializable;

@Data
public class VerifyCodeVO implements Serializable {
    @ApiModelProperty(value = "header头参数:Captcha-Key")
    private String captchaKey;
    @ApiModelProperty(value = "验证码图片")
    private String captchaImg;
}

启动应用,访问 http://localhost:8080/verify 即可得到验证码,如图: 

hutool 验证码,JAVA,spring boot,验证码,hutool,captcha

 前端调用展示:在img标签中src属性调用 /verify 接口,将传过来的图片验证码显示即可。若想换一张显示(刷新验证码):在img标签中增加一个onclick属性点击事件即可。文章来源地址https://www.toymoban.com/news/detail-658070.html

    <img src="/verify" id="verifyCode" onclick="refresh()" alt="验证码" />
    <script>
        /* 刷新验证码 */
        function refresh() {
            document.getElementById("verifyCode").src = "verify?time=" + new Date().getTime();
        }
    </script>

到了这里,关于SpringBoot验证码之使用hutool-captcha方式实现验证码生成与验证的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • uni-app使用uniCloud实现图形验证码(uni-captcha)

    uniCloud 是 DCloud 联合阿里云、腾讯云,为开发者提供的基于 serverless 模式和 js 编程的云开发平台。 官方文档:https://uniapp.dcloud.net.cn/uniCloud/uni-captcha.html 下载地址:https://ext.dcloud.net.cn/plugin?id=4048 GitCode 仓库:https://gitee.com/dcloud/uni-captcha 图形验证码主要起到人机校验或其他限制

    2024年02月08日
    浏览(31)
  • Taro React组件开发(12) —— RuiVerifyPoint 行为验证码之文字点选

    1. 效果预览 2. 使用场景 账号登录,比如验证码发送,防止无限调用发送接口,所以在发送之前,需要行为验证! 3. 插件选择 AJ-Captcha行为验证码文档 AJ-Captcha行为验证码代码仓库 为什么要选用【AJ-Captcha行为验证码】呢?因为我们管理后台使用的是 pigx ,它在后端采用的是【

    2024年02月07日
    浏览(39)
  • 常用工具类之使用hutool生成验证码

    1.1 pom文件中导入hutool-captcha依赖 💬 新建springboot项目,并在其pom.xml中导入hutool-captcha依赖: 1.2 创建前端页面与跳转页面 前端页面index.html 跳转页面success.html 1.3 实现后端代码 1.3.1 创建后端控制类生成验证码 💬 创建控制类CommonController类,一方面通过流的方式将随机生成的验

    2024年02月04日
    浏览(37)
  • 爬虫识别验证码技术 - 2Captcha

    验证码(CAPTCHA),全称为\\\"Completely Automated Public Turing test to tell Computers and Humans Apart\\\",是一种区分用户是计算机还是人的公共全自动程序。最初,验证码主要是一些混杂字母和数字的图片,但随着技术的发展,出现了更多种类的验证码,例如reCAPTCHA、GeeTest拼图验证码、hCaptc

    2024年02月16日
    浏览(31)
  • 爬虫突破验证码技术 - 2Captcha

    验证码(CAPTCHA),全称为\\\"Completely Automated Public Turing test to tell Computers and Humans Apart\\\",是一种区分用户是计算机还是人的公共全自动程序。最初,验证码主要是一些混杂字母和数字的图片,但随着技术的发展,出现了更多种类的验证码,例如reCAPTCHA、GeeTest拼图验证码、hCaptc

    2024年02月16日
    浏览(25)
  • Selenium+2Captcha 自动化+验证码识别实战

    本文深入探讨了使用Selenium库进行网页自动化操作,并结合2Captcha服务实现ReCAPTCHA验证码的破解。内容涵盖Selenium的基础知识、验证码的分类、2Captcha服务的使用,以及通过实例进行的详细讲解,最后对实践进行总结和优化思考,为读者提供了一条完整的验证码破解实践路线图

    2024年02月14日
    浏览(39)
  • burpsuite安装插件captcha-killer识别验证码

    我安装的是burpsuite v.2021版本,于2020年后,使用的captcha-killer链接地址如下: (burp版本为2020年前的可查看文末链接1) GitHub - Ta0ing/captcha-killer-java8 https://github.com/Ta0ing/captcha-killer-java8 下载zip文件并解压文件 打开burpsuite,Extender扩展 - Add添加.jar文件 -Select file选择文件 - Next -

    2023年04月08日
    浏览(50)
  • Brup+Captcha-killer+ddddocr实现验证码识别

    实验前准备:Burp(2020以后的版本jdk11) captcha-killer(burp插件针对不同版本的burp存在不同的版本) ddddocr(开源验证码识别接口最新版已支持python3.10版本) 项目地址:https://github.com/f0ng/captcha-killer-modified https://github.com/sml2h3/ddddocr burp的安装和破解在此不做赘述,首先我们到上面

    2023年04月09日
    浏览(35)
  • 对有验证码的后台网页进行爆破-captcha-killer-modified

    实例:以pikachu靶场为目标 攻击目标url:http://xxxx/pikachu-master/vul/burteforce/bf_server.php(xxxx为自己的靶机地址,我的就是127.0.0.1) 攻击目标的验证码图片接口的url:http://127.0.0.1/pikachu-master/inc/showvcode.php 通过burp工具抓包(设置burp代理之后,点击login抓包包) 右击选择发送到captcha

    2024年02月08日
    浏览(28)
  • [golang gin框架] 40.Gin商城项目-微服务实战之Captcha验证码微服务

    本次内容需要 gin框架基础知识, golang微服务基础知识才能更好理解 在前面,讲解了微服务的架构等,这里,来讲解前面商城项目的 Captcha验证码 微服务 ,captcha验证码功能在前台,后端 都要用到 ,可以把它 抽离出来 ,做成微服务功能 编辑 这个验证码功能封装代码captcha.go如下: 把这个

    2024年02月16日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包